Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Algorithm 如何证明均匀划分是快速排序算法的最佳情况?_Algorithm_Sorting_Computer Science_Quicksort - Fatal编程技术网

Algorithm 如何证明均匀划分是快速排序算法的最佳情况?

Algorithm 如何证明均匀划分是快速排序算法的最佳情况?,algorithm,sorting,computer-science,quicksort,Algorithm,Sorting,Computer Science,Quicksort,为什么我们说快速排序的最佳情况是“每次执行分区时,我们将列表分成两个几乎相等的部分”?如何证明这正是所谓的“最佳情况”?采用长度为2^N的数组(为了简单起见) 比较每个阶段的完美分割情况(N分为N/2+N/2)和分段长度N分为1和N-1的操作数,采用长度2^N的数组(为简单起见) 比较每个阶段完美分割的情况(N分为N/2+N/2)和分段长度N分为1和N-1我创建了一个程序,而不是试图进行分析。我比较了1/2,1/2(50%50%)和1/4,3/4(25%75%)的拆分情况,随着n变得越来越大,似

为什么我们说快速排序的最佳情况是“每次执行分区时,我们将列表分成两个几乎相等的部分”?如何证明这正是所谓的“最佳情况”?

采用长度为
2^N的数组(为了简单起见)


比较每个阶段的完美分割情况(
N
分为
N/2+N/2
)和分段长度
N
分为
1
N-1
的操作数,采用长度
2^N
的数组(为简单起见)


比较每个阶段完美分割的情况(
N
分为
N/2+N/2
)和分段长度
N
分为
1
N-1
我创建了一个程序,而不是试图进行分析。我比较了1/2,1/2(50%50%)和1/4,3/4(25%75%)的拆分情况,随着n变得越来越大,似乎需要多做22%的操作。为1/4,3/4拆分设置代码:对于1/2,1/2拆分,将行从left=(n+3)/4更改为left=(n+1)/2。左上舍入的要点是确保left>=1,以避免无限递归

#include <stdio.h>
typedef unsigned long long uint64_t;
static uint64_t sum;

void qsa(uint64_t n)
{
uint64_t left, right;
    if(n < 2)
        return;
    sum += n;
    left = (n+3)/4;         /* or left = (n+1)/2  */
    right = n - left;
    qsa(left);
    qsa(right);
}

int main()
{
    qsa(1024*1024);
    printf("%llu\n", sum);
    return(0);
}

我创建了一个程序,而不是试图进行分析。我比较了1/2,1/2(50%50%)和1/4,3/4(25%75%)的拆分情况,随着n变得越来越大,似乎需要多做22%的操作。为1/4,3/4拆分设置代码:对于1/2,1/2拆分,将行从left=(n+3)/4更改为left=(n+1)/2。左上舍入的要点是确保left>=1,以避免无限递归

#include <stdio.h>
typedef unsigned long long uint64_t;
static uint64_t sum;

void qsa(uint64_t n)
{
uint64_t left, right;
    if(n < 2)
        return;
    sum += n;
    left = (n+3)/4;         /* or left = (n+1)/2  */
    right = n - left;
    qsa(left);
    qsa(right);
}

int main()
{
    qsa(1024*1024);
    printf("%llu\n", sum);
    return(0);
}

如果您证明在这种情况下复杂性为O(n.log(n)),那么您证明了这是一种最佳情况,因为使用比较进行排序至少需要O(n.log(n))。要证明它是唯一的最佳情况要困难得多,你必须证明任何其他分区模式都会导致更大的复杂性。@Jean BaptisteYunès-任何导致固定比率的分区方案,例如总是将分区拆分为1/4和3/4大小,也是O(n log(n))。要证明这比分裂成1/2和1/2更糟糕,正如你所提到的,这有点困难。@rcgldr是的,这只会修改日志的底部,但在极值(分裂1 | n-1)或(k | n-k)中的任何常数k,你会陷入O(n^2)。这就是我的意思。如果你证明在这种情况下复杂性是O(n.log(n)),那么你证明了这是一个最好的情况,因为使用比较进行排序至少要花费O(n.log(n))。要证明它是唯一的最佳情况要困难得多,你必须证明任何其他分区模式都会导致更大的复杂性。@Jean BaptisteYunès-任何导致固定比率的分区方案,例如总是将分区拆分为1/4和3/4大小,也是O(n log(n))。要证明这比分裂成1/2和1/2更糟糕,正如你所提到的,这有点困难。@rcgldr是的,这只会修改日志的底部,但在极值(分裂1 | n-1)或(k | n-k)中的任何常数k,你会陷入O(n^2)。这就是我的意思。