快速排序
public static void quickSort(int[] arr, int starIndex, int endIndex) {
if (starIndex >= endIndex) {
return;
}
int midIndex = partition(arr,starIndex,endIndex);
quickSort(arr,starIndex,midIndex-1);
quickSort(arr,midIndex+1,endIndex);
}
public static int partition(int[] arr, int starIndex, int endIndex) {
int midNumber = arr[starIndex];
int left = starIndex;
int right = endIndex;
while (left != right) {
//这里---------------------------------------
while (left < right && arr[right] >= midNumber) {
right--;
}
while (left < right && arr[left] <= midNumber) {
left++;
}
//这里---------------------------------------
if (left < right) {
int a = arr[left];
arr[left] = arr[right];
arr[right] =a;
}
}
int a = arr[starIndex];
arr[starIndex] = arr[left];
arr[left] = a;
return left;
}
其中
while (left < right && arr[right] >= midNumber) {
right--;
}
while (left < right && arr[left] < midNumber) {
left++;
}
和
while (left < right && arr[right] > midNumber) {
right--;
}
while (left < right && arr[left] <= midNumber) {
left++;
}
和
while (left < right && arr[right] >= midNumber) {
right--;
}
while (left < right && arr[left] <= midNumber) {
left++;
}
的区别
第一个错,第2,3个对的原因,第一次取基数的时候,第一种left和right的两个判断条件都不能成功,没有覆盖基数=arr[left]的情况,所以right不++,left不–。所以第一轮基数位置交换了2次,与目标不服。