算法-图解快速排序

wiki解释:

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。


分治法:

分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。


步骤:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。


public static void quickSort(int[] a, int left, int right) {
        int low = left;
        int high = right;
        int p = a[right];
        int blank = right;
        //循环一轮,最左的放到基数左边,最右的放到基数右边。
        while ( low < high ) {
            //从左往右找比基数大的数。
            while (low < high && a[low] < p) {
                low++;
            }
            //判断low位置上的数是否比基数大,是的话就把low位置上的数和基数为进行交换,并且保存,空出来的位置。
            if(a[low] > p) {
                a[high] = a[low];
                blank = low;
            }
            //从右往左找比基数小的数。
            while (high > low && a[high] > p) {
                --high;
            }
            if(a[high] < p){
                a[low] = a[high];
                blank = high;
            }
        }
        //第一轮结束后,最后把基数填到最后一个最后空出来的位置上。
        a[blank] = p;
        //low是否到了数组的最左边,是的话表示左边的数组都排序好了。
        if(low > left){
            quickSort(a,left,low-1);
        }
        //high位置是否到了数组的最右边,是的话表示右边的数组都排序好了。
        if(high < right){
            //右边排序
            quickSort(a,high+1,right);
        }
    }

猜你喜欢

转载自blog.csdn.net/helianus/article/details/80448480