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放到了前面,会先执行,如果有个“=”,会造成数组越界,后来仔细思考,想到条件的先后顺序不能随意,改正之后排序结果就正确了
这里没考虑好的有两点
①没考虑到查找到末尾
②判断条件的先后顺序