我试图实现快速排序,以下算法适用于具有所有唯一值的数组(例如{3,7,8,5,2,1,9,4}),但不适用于具有重复值的数组(例如{3,7,8,5,2,1,9,5,4})。
我理解为什么算法失败:因为两个指针i和j永远不会增加,所以当指向重复值时,条件arr [i]< pivot和arr [j]> pivot永远不会得到满足,代码陷入无限循环,试图反复交换这些值。我也明白,在交换行之后放置i ++和j--可以解决这个问题,并最终对数组进行正确的排序。但我不明白为什么。
我一直在研究quicksort,我认为一般的概念是在每次迭代排序数组/子阵列之后,枢轴最终会在它的最后一个"#34;排序位置。当我将i ++和j--行添加到这个算法时,这不再是真的;每次迭代都以枢轴不一定在最终位置结束,因此假设枢轴位置已经正确,对左右子阵列进行排序是没有意义的。
有人可以解释我的代码有什么问题,或者我对算法的理解有什么问题?谢谢!
public void quickSort(int[] arr) {
quickSort(arr, 0, arr.length-1);
}
public void quickSort(int[] arr, int low, int high) {
System.out.print("before: ");
printArr(arr);
if ( ((high - low) + 1) < 2) //as long as the subarray length not equal to 0 or 1
return;
int pivot = arr[low];
int i = low;
int j = high;
System.out.println("pivot = " + pivot + ", low = " + low + ", high = " + high);
while(i < j) {
while(arr[i] < pivot) {
i++;
}
while(arr[j] > pivot) {
j--;
}
if(i < j) {
swap(arr, i, j);
}
}
System.out.print("after: ");
printArr(arr);
quickSort(arr, low, i-1);
quickSort(arr, j+1, high);
}
public void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void printArr(int[] arr) {
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}