先看代碼
//快排
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相等的時候不用交換,最多一個相等,如果兩個相等交換,會進入死循環。