快速排序法----二分法

当年读书的时候没好好学习,以至于对经典算法的掌握实在是不敢恭维...

直到出来工作了,才慢慢的重拾起它们。

递归,冒泡排序法都比较好理解,唯独快速排序法(二分法),理解起来总觉得有点绕...

故记之,方便日后直接拿来用。

//快速排序函数参数说明:
//Arr 需要排序的数组
//left 需要排序数组的左界(也就是0)
//right 需要排序数组的右界(也就是 Arr.lenght - 1)
var quickSort = function(Arr, left, right){
    var p; //用来存入每次对比整理过之后,基准元素的所在位置(下标)
    if(left < right){
        p = partition(Arr, left, right);
        quickSort(Arr, left, p - 1);
        quickSort(Arr, p + 1, right);
    };
};

var partition = function(Arr, left, right){
    var lm, //左标记
        rm, //右标记
        pivot, //用来存入基准元素
        t; //用来缓存需要呼唤位置的两个元素的其中一个
        
    pivot = Arr[left];
    lm = left - 1;
    rm = right + 1;
    
    /*
    下面这段逻辑的思想是:
    分别从数组的最左端和最右端开始,与基准元素做对比,左标记和右标记分别记住左右两端参与对比的数的下标
    当左端的数小于或等于基准元素,那么它的位置不用改变,左标记右移一位(+1)
    当右端的数大于基准元素,那么它的位置不用改变,右标记左移一位(+1)
    当左标记指向的数大于基准元素,右标记指向的数小于或等于基准元素,那么左标记和右标记指向的数进行位置互换
    
    循环执行上面的逻辑,直到左标记和右标记相遇(它们的差为1)
    此时左标记所在的位置起往左的数全部都小于或等于基准元素,将基准元素与左标记指向的元素互换位置
    然后得到的数组就符合 基准元素左边的所有元素都小于或等于基准元素,右边的所有元素都大于基准元素 的规则
    数字被成功分类成两部分
    
    最后,返回调整位置后基准元素所在的位置(下标)
    */
    while(lm + 1 != rm) {
        if(Arr[lm+1] <= pivot){
            lm++;
        }else if(Arr[rm-1] > pivot){
            rm--;
        }else{
            t=Arr[lm+1];
             Arr[++lm]=Arr[rm-1];
             Arr[--rm]=t;
        }
    }
    
    Arr[left] = Arr[lm];
    Arr[lm] = pivot;
    return lm;
}
原文地址:https://www.cnblogs.com/czf-zone/p/3608962.html