K& R qsort理解

时间:2015-09-07 22:51:26

标签: c sorting

我对这部分代码有疑问(粗体):

/* 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

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]