快速排序由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);
}