【发布时间】:2017-09-23 07:47:42
【问题描述】:
我使用 Cormen Algorithms 书中的 Hoare 分区对 Quicksort 进行编码。我无法在我的代码中发现任何错误,它看起来就像书中的伪代码。
swapping i, j : 0, 8
-2 2 -5 -3 6 0 1 0 -1 4
swapping i, j : 1, 3
-2 -3 -5 2 6 0 1 0 -1 4
p is: 2
swapping i, j : 0, 1
-3 -2 -5 2 6 0 1 0 -1 4
p is: 0
完成上述交换后,此代码最终会在子数组{-3, -2} 上进行分区。对于这个subarray,主元是-3,partition() returns 0 是index (j)。由于该子数组已经在0th index 位置使用枢轴-3 进行了排序,因此每次快速排序时都不会进行任何更改。所以 qsort 永远循环。
谁能告诉我这与书中的 Hoare 分区有何不同,如果相同,为什么这不起作用?
void swap(int *a, int i, int j) {
cout << "swapping i, j : " << i << ", " << j << endl;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp; }
int partition(int *a, int len) {
int pivot = a[0];
int i = -1, j = len;
while (true) {
while ( ++i && a[i] < pivot && i< j) {}
while (--j && a[j] > pivot && i <j) {}
if (i < j )
swap(a, i, j);
else
return j ;
} }
void qsort(int a[], int len) {
int p = partition(a, len);
cout << "p is: " << p << endl;
qsort(a, p);
qsort(a+p, len - p ); }
int main(int argc, char *argv[]) {
int a[10] = {-1, 2, -5, -3, 6, 0, 1, 0, -2, 4};
qsort(a, 10); }
【问题讨论】:
-
swapping i, j : 0, 1何时发生?你的意思是swapping i, j : 0, 2? -
交换 i, j : 0, 1 表示交换输入的数组 'a' 的索引 0 和索引 1 处的值正在交换。
-
我明白了,但我认为索引
0和2在第二次调用qsort(a, 3)期间被交换了 -
向 OP 添加了原始数组在每次交换后的外观。第三次交换后,p为0,子数组为{-3, -2}
-
第二次交换后,
p = 2。然后在partition(a, 3)中,i变为0(正如你所说的那样),但j变为2(而不是1),因为-5 < -2(-2是pivot)
标签: c++ algorithm quicksort partitioning hoare-logic