zoukankan      html  css  js  c++  java
  • 排序算法-快速排序(javascript)

    快速排序

    算法思想:在待排序数组中,首先任意选取一个数据作为关键数据(通常取第一个或中间一个),然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。再递归直到结束排序。

    从j开始向前搜索(j--),遇到小于key的就将array[j]与array[i]交换;从i往后搜索(i++),遇到大于key的就将array[i]与array[j]交换;再递归。

    举个栗子:  

    将第一个数字作为关键数据 key=6;

    6  2  7  3  8  9  此时i=0;j=5;

    3  2  7  6  8  9  此时i=0;j=3;

    3  2  6  7  8  9  此时i=2;j=3;

    3  2  6  7  8  9  此时i=j=2;第一次循环结束

    function quickSort(array){
        function sort(prev, numsize){
            var i = prev;
            var j = numsize -1;
            var key = array[prev];
            if ((numsize - prev) > 1) {
                while(i < j){
                    for(; i < j; j--){
                        if (array[j] < key) {
                            array[i++] = array[j]; //a[i] = a[j]; i += 1;
                            break;
                        };
                    }
                    for( ; i < j; i++){
                        if (array[i] > key){
                        array[j--] = array[i];
                        break;
                        }
                    }
                }
                array[i] = key;
                sort(0, i);
                sort(i + 1, numsize);
            }
        }
        sort(0, array.length);
        return array;
    }

    另外还有一种简单易懂的方法:

    设置两个空数组left和right,将整个数组进行遍历,遇到小于关键数据的就push进left,否则放进right。此处以中间数作为关键数据更好理解。

    function quickSort(arr){
    
        if(arr.length <= 1){
            return arr;
        }
        var pivotIndex = Math.floor(arr.length/2); //取中间的为基准
        var pivot = arr.splice(pivotIndex, 1)[0];  //将基准取出并从原数组删除
        var left = [];
        var right = [];
        for(var i = 0;i < arr.length;i++){
            if(arr[i] < pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
    
        return quickSort(left).concat([pivot],quickSort(right));
    }

     

  • 相关阅读:
    Mysql分布式事务
    Mysql锁
    Mysql事务隔离级别
    java 资源监控
    Mysql子查询
    javaWeb四大域对象
    KVM 迁移
    KVM 虚拟化
    网络基础
    系统简单启动过程
  • 原文地址:https://www.cnblogs.com/PeriHe/p/7906382.html
Copyright © 2011-2022 走看看