先看代码
//快排
private int partition(int[] a,int start,int end){
int key=a[start];
int i=start,j=end;
while(i<j){
while (i<j && a[j]>=key) {j--;}//考虑2个数的时候的分区,先从右算
while (i<j && a[i]<=key) {i++;}//最多只能一边和key相等时结束
//交换 这里i<=j
int t=a[i];
a[i]=a[j];
a[j]=t;
}
//key置换
a[start]=a[j];
a[j]=key;
return j;
}
public void quickSort(int[] a,int start,int end){
if(start>=end)
return;
int mid=partition(a,start,end);
//中间的不用算
quickSort(a,start,mid-1);
quickSort(a,mid+1,end);
}
public int[] quickSort(int[] a){
quickSort(a,0,a.length-1);
return a;
}
写代码的时候要考虑要只有两个元素的时候运行情况,比如[3,2]
如果以第一个为参照key的话,i和j应该指向2,这样的话,应该是j先进入循环,也就是从右向左找,找到比key小,即2.然后i也走到2.
如果先i进入循环,左向右,就错了。
其次i,j位置的数和key相等的时候不用交换,最多一个相等,如果两个相等交换,会进入死循环。