【问题标题】:Lomuto-Partition in quick sort快速排序中的 Lomuto-Partition
【发布时间】:2013-10-02 07:24:35
【问题描述】:

众所周知,在快速排序中,您可以使用 Lomuto-Partition。我检查了很多参考资料,几乎所有参考资料都提出了以下实现:

int L_partition(int *a, int l, int r)
{
    int i, j, p, t;

    p = a[r];
    i = l - 1;

    for(j =l; j <= r-1; j++) {
        if(a[j] <= p) {
            i++;

            t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }

    t = a[i+1];
    a[i+1] = a[r];
    a[r] = t;

    return i+1;
}

我的问题是为什么 il-1 开头并包含所有 i+1 内容?我认为从 l 开始就可以了。我测试下面的程序。它给出了与上述结果相同的结果。这比上面的要简单得多。

int L_partition2(int *a, int l, int r)
{
    int i, j, p, t;

    p = a[r];
    i = l;

    for(j = l; j <= r-1; j++) {
        if(a[j] <= p) {
            t = a[j];
            a[j] = a[i];
            a[i] = t;

            i++;
        }
    }

    t = a[i];
    a[i] = a[r];
    a[r] = t;

    return i;

}

【问题讨论】:

  • 你的版本更好。它是等效的,但更有意义且更易于阅读。我不知道为什么这些书是相反的。
  • 由于这是非常基本和经典的算法,我想知道我是否错过了任何一点。几乎所有大学 CS 课程的网站和幻灯片都使用第一种方法。
  • 这很奇怪。没关系,它是相同的算法,但 IMO 你的代码更好。也许 (i-1) (i+1) 的东西出现在一些旧文本中,而其他人只是复制它。

标签: c algorithm quicksort


【解决方案1】:

这和你只是改变i的用法完全一样。

请注意,您在交换之后递增 i,因为您的从一开始就有效,而原始版本在交换之前递增它。但重要的是交换始终使用相同的元素(在您的版本和原始版本中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2021-06-12
    • 1970-01-01
    • 2020-08-14
    • 2014-10-10
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多