对于课程作业,我的任务是实施基本的Quicksort算法。我已经实现了我认为是一个有效的Quicksort,但它不适用于我们必须测试的一个特定阵列。这个数组应该是最糟糕的情况,应该可以理解地进行更多比较,但在这种情况下我根本无法生成排序数组。
伪代码:
开始quickSort
如果(R> L)那么
p:=分区(A,L,R);
快速排序(A,L,P-1);
快速排序(A,P + 1,R);
网络连接
结束
开始分区
v:= A [右]
pL:= left; pR:= right-1;
while(pL< pR)do
而(A [pL]< v)do PL:PL = + 1 OD 而(A [pR]> = v且pR>左)做
PR:= PR-1
OD
if(pL< pR)then
交换(A,pL,pR)
网络连接
OD
交换(A,PL,右);
返回pL;
相关代码:
public void quickSort(int[] A, int L, int R) {
if (L < R) {
int p = partition(A, L, R);
quickSort(A, L, p - 1);
quickSort(A, p + 1, R);
}
}
private int partition(int[] A, int left, int right) {
int pivot = A[right];
int pointerLeft = left;
int pointerRight = right - 1;
while (pointerLeft < pointerRight) {
while (A[pointerLeft] < pivot) {
pointerLeft = pointerLeft + 1;
compQS++;
}
while (A[pointerRight] > pivot && pointerRight > left) {
pointerRight = pointerRight - 1;
compQS++;
}
if (pointerLeft < pointerRight) {
swap(A, pointerLeft, pointerRight);
}
}
swap(A, pointerLeft, right);
return pointerLeft;
}
private void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
有问题的数组:
1 3 41 五 6 9 11 20 21 22 23 24 26 28 29 三十 33 39 41 41 43 45 46 2 54 55 55 56 57 60 61 63 65 66 67 69 69 70 71 180 73 74 76 77 79 138 81 83 85 88 91 92 92 94 94 95 99 101 101 103 105 106 107 110 113 115 118 125 127 128 129 136 80 143 144 147 148 150 152 153 155 156 158 163 169 170 171 175 176 178 75 184 185 189 190 193 194 195 196 199
非常感谢任何指导。我不禁认为这与重复有关,但无法看到我的实现出错的地方。
答案 0 :(得分:1)
看看代码,两点似乎很可疑:
在递归中,你写
quickSort(A, L, p - 1);
quickSort(A, p + 1, R);
任何一个应该是p,否则你错过了中间元素。
看似奇怪的另一条线是
swap(A, pointerLeft, right);
我认为如果右(这是枢轴)是左右之间的最大值,这将导致麻烦。考虑到这一点,我认为当枢轴是极值(集合中的最小值或最大值)时,问题出现在分区代码中。这与给定数组非常糟糕的情况一致。
答案 1 :(得分:0)
我在您的代码中看到两个可能的问题:
1)当你第一次调用quickSort时,你错过了中间值(你使用p-1作为第一次调用的右表达式,p + 1作为第二次调用的左表达式,p会发生什么?)
2)您正在使用 右
交换pointerLeft请改为尝试:
quicksort(A,L,p);
quicksort(A,p+1,R);
和
swap(A,pointerLeft,pointerRight);
试一试!