Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 快速排序中的Lomuto划分_C_Algorithm_Quicksort - Fatal编程技术网

C 快速排序中的Lomuto划分

C 快速排序中的Lomuto划分,c,algorithm,quicksort,C,Algorithm,Quicksort,正如我们所知,在快速排序中,您可以使用Lomuto分区。我查阅了大量参考资料,几乎所有参考资料都提出了以下实现: 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];

正如我们所知,在快速排序中,您可以使用Lomuto分区。我查阅了大量参考资料,几乎所有参考资料都提出了以下实现:

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;
}
int-L\u分区(int*a,int-L,int-r)
{
int i,j,p,t;
p=a[r];
i=l-1;

对于(j=l;j来说,这完全是一样的,您只是在改变
i
的用法


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

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

}