gpt4 book ai didi

c++ - 为什么按降序排序与升序排序时快速排序需要更长的时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:39 27 4
gpt4 key购买 nike

我有快速排序和归并排序的代码,并且我放置了一个全局计数器变量,每次迭代(比较)时它都会递增。我假设这符合我粗略的渐近分析。对于合并排序,它确实如此,但对于快速排序,它却没有。我不明白为什么。我选择输入数组的最后一个元素是每次迭代的基准。我知道这不是最优的,但为了本次讨论,这无关紧要。因为我选择了最后一个元素,所以我希望升序和降序数组都会导致 O(n^2) 比较。更具体地说,我希望比较的次数是 n 选择 2,因为在最坏的情况下你要添加 n + n-1 + n-2 + n-3 + .... + 1。但这似乎并没有发生。

在输入大小为 100,000 的情况下,输入按降序排序,我得到 705,082,704 次迭代计数。对于按升序排序的输入数组,我得到相同的数字。但是10万选2就是50亿左右。为什么会出现差异?

对于合并排序,输入为 100,000,我得到大约 160 万次迭代,这看起来是正确的。

以下是包含我的快速排序实现和计数技术的代码,两者都可能关闭,从而导致这种差异。否则一定是我的逻辑有误,应该迭代多少次?

另外,顺便说一句,尽管升序和降序输入数组的比较次数相同,但升序版本的速度是其 2-3 倍,这让我感到好奇。什么可以解释这一点。事不宜迟,这里是代码。

int counter = 0;
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}


int partition(int *array, int low, int high){
int firsthigh = low;
int pivot = high;

for(int i = low; i < high; i++)
{
counter++;
if(array[i] < array[pivot])
{
swap(array[i], array[firsthigh]);
firsthigh++;
}
}
swap(array[pivot],array[firsthigh]);
return firsthigh;
}

void quicksort(int *array, int low, int high){
int p;
if(low < high)
{
p = partition(array, low, high);
quicksort(array, low, p-1);
quicksort(array,p+1,high);
}
}

int main(){
int array[100000];
for(int i = 0; i < 100000; i++)
array[i] = i;

struct timeval start, end;

for(int i = 0; i < 100000; i++)
cout << array[i] << " ";

gettimeofday(&start, NULL);

//mergesort(array, 0, 99999);
quicksort(array, 0, 99999);

gettimeofday(&end, NULL);
long long time = (end.tv_sec * (unsigned int)1e6 + end.tv_usec) -
(start.tv_sec * (unsigned int)1e6 + start.tv_usec);

for(int i = 0; i < 100000; i++)
cout << array[i] << " ";
cout << endl;

cout << endl << endl << time/1000000.0 << endl;
cout << endl << counter;
}

最佳答案

  1. 如果要计算内部for循环的迭代次数,请使用long longn*(n-1)/2 溢出 int for n = 100 000。如果你想计算交换,你应该在交换完成时增加你的计数器。

  2. 为此进行的两个简单优化是:

当然还有其他算法,但这应该能让你得到一个不错的算法。

关于c++ - 为什么按降序排序与升序排序时快速排序需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com