我对这部分代码有疑问(粗体):
/* swap: interchange v[i] and v[j] */
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
/* qsort: sort v[left]...v[right] into increasing order */
void qsort(int v[], int left, int right)
{
int i, last;
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);
}
我不明白的部分是:
last = left; /* to v[0] */
for (i = left + 1; i <= right; i++) /* partition */
if (v[i] < v[left])
swap(v, ++last, i);
因此,如果left
初始化为0
。所以last
将等于零。
然后在for循环中,i
等于1
,如果:
if (v[i] < v[left])
然后
swap(v, ++last, i);
但这次交换的重点在哪里?传递给具有预增量的函数时,last
是否变为1
?那么++last
== i
== 1
?
答案 0 :(得分:3)
当你正确地缩进它是否更清楚?
last = left; /* to v[0] */
for (i = left + 1; i <= right; i++) /* partition */
if (v[i] < v[left])
swap(v, ++last, i);
该行代码不会只运行一次,而i
并不总是等于last
+ 1.在第一次迭代中,它可能最终与自身交换v[i]
。