public static int partion(int[] list, int first, int last) {
int pivot = list[first];
int low = first + 1;
int high = last;
while (low < high) {
//從左往右找到大於主元的元素
while (low <= high && list[low] <= pivot)
low++;
//從右到左找到小於主元的元素
while (low < high && list[high] > pivot)
high–-;
//找出之後交換兩個元素
if (low < high) {
int temp = list[low];
list[low] = list[high];
list[high] = temp;
}
}
//把主元放到正確位置
list[first] = list[low - 1];
list[low - 1] = pivot;
//返回主元位置
return low - 1;
}
public static void quickSort(int[] list, int first, int last) {
if (last > first) {
int pivotIndex = partion(list, first, last);
quickSort(list, first, pivotIndex - 1);
quickSort(list, pivotIndex + 1, last);
}
}
一開始沒考慮到low直接找到尾部的情況(比如數組{4,1,2,3})
while(low <= high && list[low] <= pivot)
low++;
寫成
while(list[low] <= pivot && low < high)
low++;
爲什麼條件不寫low<=high?因爲list[low] <= pivot放到了前面,會先執行,如果有個“=”,會造成數組越界,後來仔細思考,想到條件的先後順序不能隨意,改正之後排序結果就正確了
這裏沒考慮好的有兩點
①沒考慮到查找到末尾
②判斷條件的先後順序