RICH-ATONE

快速排序

快速排序的思想是这样的,如果要对数组区间 [p, r] 的数据进行排序,我们先选择其中任意一个数据作为 pivot(分支点),一般为区间最后一个元素。

然后遍历数组,将小于 pivot 的数据放到左边,将大于 pivot 的数据放到右边。接着,我们再递归对左右两边的数据进行排序,直到区间缩小为 1 ,说明所有的数据都排好了序。

填坑法:快速排序的另一种实现方式如下所示,先取出一个元素作为 pivot(假设是最后一个),这时 pivot 位置可以看作为空,然后从左到右查找第一个比 pivot 大的元素放在 pivot 的位置,此时空的地方变成了这第一个比 pivot 大的元素位置。
然后从右到左查找第一个比 pivot 小的元素放在刚才空的位置,依次循环直到从左到右和从右到左都查找到了同一位置,这时候再把 pivot 放置在最后一个空位。这个过程可以形象的被称为“挖坑填坑”。

  

 代码示例:

    public static int[] test(int arr[],int begin,int last){

        while (begin>last){
            return null;
        }
        int i=begin;
        int j=last;
        int pivot=arr[j];
        while (i<j){
            while (i<j && arr[i]<=pivot){
                i++;
            }
            if (arr[i]>pivot){
                arr[j--] = arr[i];
            }
            while(i<j && arr[j]>pivot){
                j--;
            }
            if (i<j && arr[j]<pivot){
                arr[i++]=arr[j];   //此处是i++,还是i;测试是一样的,先赋值在+1
            }
        }
        if (i==j){
            arr[i]=pivot;
        }
        test(arr,begin,i-1);
        test(arr,i+1,last);

        return arr;
    }

  

参考:排序算法之——归并排序和快速排序

posted on 2022-10-28 18:13  RICH-ATONE  阅读(52)  评论(0编辑  收藏  举报

导航