【发布时间】:2012-08-13 17:19:04
【问题描述】:
我在理解 K&R 的快速排序算法(没有指针的简化版本)时遇到问题。 Dave Gamble 在这里explanation 已经提供了详尽的解释。 然而我注意到,通过从一个稍微改变的字符串开始,我们可以在 for 循环的许多循环中获得没有交换。 首先是代码:
void qsort(int v[], int left, int right)
{
int i, last;
void swap(int v[], int i, int j);
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2); /* move partition elem */
last = left; /* to v[0] */
for (i = left + 1; i <= right; i++) /* partition */
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last); /* restore partition elem */
qsort(v, left, last-1);
qsort(v, last+1, right);
}
我认为的演练:
我们从 CADBE 开始;左=0;对=4; D是支点 所以根据算法我们将D与C交换以获得DACBE
最后一个=左=0
i = 1 if ( v1 1 (因为 last 在操作之前递增)与 v1 交换所以没有任何变化,last = 1,仍然有 DACBE;
现在 i = 2 if ( v[2] true 所以我们将 v[2] 与 v[2] 交换,没有任何改变;最后一个 = 2
现在 i = 3 if ( v[3] true 所以我们用 v[3] 交换 v[3] 没有任何改变 AGAIN (!), last = 3
显然有些地方出了问题,算法什么也没做。 非常感谢您的意见。我一定是错的,作者比我好;D 提前致谢!
【问题讨论】:
-
您还没有完成演练。在最后一次交换之后,就在第一次递归调用 qsort 之前会发生什么?