快排回顾

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

 

具体怎么实施的?

针对序列

arr=【10,8,9,12,15,6,10,1】

 

三个指针:

smallPoint(sp)

bigPoint(bp)

index(i)

第一步:10=base bp,sp 不变 i++;

 

第二步:8<base 要把8放到小于base的区域(与等于base区域第一个交换),同时小于区域扩张,i++;

 

第三步:9<10,同上步骤

第四步:12>10,大于base的红色区域扩张(和区域前第一个元素交换);i不变,sp--;

第五步:由于i没有变化,则arr[i]=1 < base ,同第二步。

最后一步,直到i与sp指针相遇,最终结果是:

 

以上仅仅是快排的第一层递归。

 

详细java源码为:

    public static void swap(int[] arr,int a,int b){
        int temp =arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public static int[] qss(int[] arr,int l,int r,int base1){
        int base =base1;
        int i = l;
        int bp = r+1;
        int sp = l-1;
     
        while (i<bp){
            if (arr[i]<base){
                swap(arr,i++,++sp);
            }else if (arr[i]>base){
                swap(arr,i,--sp);
            }else {
                i++;
            }
        }
        return new int[]{sp+1,bp-1};
    }


    public static void qsort(int[] arr,int a,int b){
        if (a>=b){
            return;
        }
        int[] fen = qss(arr, a, b,arr[a]);
        qsort(arr,a,fen[0]-1);
        qsort(arr,fen[1]+1,b);
    }

 

 

 

 

 

 

posted @ 2019-03-20 22:37  dyigstraw  阅读(102)  评论(0编辑  收藏  举报
foot