我在理解 K&R 的快速排序算法(没有指针的简化版本)时遇到问题。 Dave Gamble 已经在这里提供了详尽的解释解释 https://stackoverflow.com/questions/1231254/kr-qsort-example-with-pointers-and-arrays-confusion。
然而我注意到,从稍微改变的字符串开始,我们在 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
我 = 1 如果 ( v1 https://stackoverflow.com/questions/1231254/kr-qsort-example-with-pointers-and-arrays-confusion1(因为最后一个在操作之前递增)与 v1 https://stackoverflow.com/questions/1231254/kr-qsort-example-with-pointers-and-arrays-confusion所以没有任何变化,last = 1,仍然有 DACBE;
现在 i = 2 if ( v[2] true 所以我们将 v[2] 与 v[2] 交换,一切都没有改变;最后 = 2
现在 i = 3 if ( v[3] true 所以我们用 v[3] 交换 v[3] 没有任何改变(!),最后 = 3
所以显然出了问题,算法什么也没做。
非常感谢您的意见。我一定是错的,作者比我好;D
提前致谢!