对于课程作业,我的任务是实现一个基本的快速排序算法。我已经实现了我认为可以工作的快速排序,但是它不适用于我们必须测试的特定数组。这个数组应该是最坏的情况,应该进行更多的比较是可以理解的,但在这种情况下我根本无法让它产生一个排序的数组。
伪代码:
开始快速排序
如果 (R > L) 那么
p := 分区(A,L,R);
快速排序(A,L,p-1);
快速排序(A,p+1,R);
菲
结尾
开始分区
v := A[右]
pL := 左; pR := 右-1;
而 (pL < pR) 做
而 (A[pL] < v) 做 pL:=pL+1 od 而 (A[pR]>=v 和 pR>left) 做
pR:=pR-1
口
如果 (pL < pR) 那么
交换(A,pL,pR)
菲
口
交换(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 5 6 9 11 20 21 22 23 24 26 28 29 30 33 39 41 41 43 45 46 2 54 55 55 56 57 60 61 63 65 66 67 69 69 70 71 180 75 1 74 86 8 7 75 74 86 7 91 92 92 94 94 94 99 101 101 101 101 103 105 106 107 110 110 110 110 113 115 115 118 125 127 127 128 129 136 136 80 143 143 144 144 144 147 147 148 148 148 152 152 153 153 153 155 155 156 158 158 158 158 158 158 169 170 175 175 175 175 176 176 178 184 185 189 190 193 194 193 195 194 193 195
任何指导将不胜感激。我不禁认为这与重复有关,但看不出我的实现哪里出错了。