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


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

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

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

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

    //快速排序函数参数说明:
    //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;
    }
  • 相关阅读:
    Corn Fields
    状压DP
    全排列函数
    搜索
    前缀和与差分
    最小花费
    【Lintcode】062.Search in Rotated Sorted Array
    【LeetCode】039. Combination Sum
    【LeetCode】040. Combination Sum II
    【LeetCode】047. Permutations II
  • 原文地址:https://www.cnblogs.com/czf-zone/p/3608962.html
Copyright © 2020-2023  润新知