因此,我正在研究一个使用三个分区实现QuickSort的问题,选择数组的最左侧和最右侧的元素作为枢轴。我的函数基本上从数组的左侧和右侧进行lomoto分区。该算法基本上可以对95%的情况对数组进行排序,但是有一些对它不起作用。有人知道为什么吗?
public static int[] partition2Pivots(int[] arr, int p, int r) {
if(arr[p]>arr[r]) {
int temp = arr[p];
arr[p] = arr[r];
arr[r] = temp;
}
int pivotLow = arr[p];
int pivotHigh = arr[r];
int low = p;
int high = r;
for(int j=p; j<=r; j++) {
if(arr[j]>pivotHigh) {
high--;
int temp = arr[j];
arr[j] = arr[high];
arr[high] = temp;
}
if(arr[j]<pivotLow) {
low++;
int temp = arr[j];
arr[j] = arr[low];
arr[low] = temp;
}
}
int temp1 = arr[p];
arr[p] = arr[low];
arr[low] = temp1;
int temp2 = arr[r];
arr[r] = arr[high];
arr[high] = temp2;
int pivots[] = {low, high};
return pivots;
}
public static void quickSort2Pivots(int[] arr, int p, int r) {
if(p<r) {
int[] pivots = partition2Pivots(arr, p, r);
quickSort2Pivots(arr, p, pivots[0]);
quickSort2Pivots(arr, pivots[0]+1, pivots[1]-1);
quickSort2Pivots(arr, pivots[1], r);
}
}
答案 0 :(得分:0)
可能的故障点是两个枢轴使用相同的回路。或者可能是p的低位和r的高位的最终交换是多余的,因为循环已经从p到r都开始了。
但是首先,给出一个失败案例的示例,并尽可能地减少失败。
此外,如果将用于交换两个数组元素的代码封装在函数swap(arr,i,j)中,则可以节省大量代码以及潜在的错误。