基本思想
1、确定切分元素v,一般将最左边元素当作切分元素
2、指针left从左侧开始找到大于v的元素
3、指针right从右侧开始找到小于v的元素
4、交换两个元素
5、重复以上步骤,直到 left>right,停止
经过以上步骤,即找到切分元素的正确位置
切分
1、 对于某一个 j ,a[j]已经排定
2、a[0] 到 a[j-1] 元素全部小于 a[j]
3、a[j+1] 到 a[N-1] 元素全部大于 a[j]
代码:
public class QuickSort {
public static int partition(int[] a,int lo,int hi){
/**
* 1、确定左边第一个是切分元素v,切分元素经过此函数后,就找到了自己正确的位置
* 2、i指示左侧小于v,j指示右侧大于v。一旦i指示元素大于v,j知识元素小于v,交换i,j指示元素
* 3、当i>=j,跳出,此时j指示元素小于v,i指示元素大于v
* 4、交换v和j指示元素,这样v就排定了位置,返回此时位置j。
*/
int i=lo,j=hi+1;
int v=a[lo];//切分元素
while(true){
while(a[++i]<v) if(i==hi) break;
while(a[--j]>v) if(j==lo) break;
if(i>=j) break;
CTool.exch(a,i,j);//这里是交换元素
}
CTool.exch(a,lo,j);
return j;
}
public static void sort(int[] a,int lo,int hi){
//递归,就剩下一个元素时,不需要排序,返回
if(lo>=hi) return;
int j=partition(a,lo,hi);//确定切分元素j的位置
sort(a,lo,j-1);
sort(a,j+1,hi);
}
public static void main(String[] args) {
int[] A=new int[]{3,7,4,2,6,1,5,6};
sort(A,0,A.length-1);
for (int e:A) {
System.out.println(e);
}
}
}
其中,exch,交换函数
public static void exch(int[] a,int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}