【问题标题】:K&R qsort understandingK&R qsort 理解
【发布时间】:2015-12-04 17:23:20
【问题描述】:

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

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

【问题讨论】:

    标签: c sorting


    【解决方案1】:

    正确缩进是否更清晰?

    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]

    【讨论】:

    • 这就是为什么不使用大括号通常是个坏主意
    • 我只是从书中复制了这段代码。所以,好的,我们有:{3, 2, 1}。因此,如果我阅读此代码,则表示 2
    • 你是对的。这就是当数据的顺序完全错误时 quickSort 变成 veryVerySlowSort 的方式。
    • 感谢您的解释。我有点困惑。为什么他们添加了如此无用的代码。但他们在书中的描述仅用于教育目的,效率不高。
    • @Simon:你把所有东西都用正确的格式搞混了。一个很常见的失败。
    【解决方案2】:
        last = left; /* to v[0] */
    for (i = left + 1; i <= right; i++) /* partition */
        if (v[i] < v[left])
            swap(v, ++last, i);
    

    因为i 并不总是等于++last 并且i 比循环中的last 变量增长得更快。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多