【发布时间】:2021-01-18 15:08:55
【问题描述】:
我尝试制作自己的排序算法(现在称为 MySort),并根据 QuickSort 的排序时间对其进行基准测试。我使用随机数生成器生成包含 n 个随机数的输入文件,然后将此文件作为 MySort 和 QuickSort 的输入提供,并使用 std::chrono 分别计算它们所花费的时间。
(起初我使用在线编译器来检查时间,但是当我达到输入 10000 个字符的限制时,我转而在我的 PC 上自己做。)
所以,对于最初的几次尝试(100 个元素、1000 个元素、10000 个元素、100000 个元素),一切正常。对于每个排序算法所花费的时间,我得到了适当的输出时间,但是当我尝试使用 1000000 个元素时,QuickSort 只是不提供任何输出(似乎根本不起作用),这很奇怪,因为 MySort 工作得很好。我不认为这是空间问题,因为 MySort 使用了 2n 额外空间并且工作正常。
我正在使用的 QuickSort 的实现如下:
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
void quick_sort(int[],int,int);
int partition(int[],int,int);
int main()
{
int n,i;
cin>>n;
int a[n];
for(i=0;i<n;i++)
cin>>a[i];
auto start = high_resolution_clock::now();
quick_sort(a,0,n-1);
auto stop = high_resolution_clock::now();
duration <double, micro> d = stop - start;
cout<<"Time taken = "<<d.count()<<endl;
/*
cout<<"\nArray after sorting:";
for(i=0;i<n;i++)
cout<<a[i]<<endl;
*/
return 0;
}
void quick_sort(int a[],int l,int u)
{
int j;
if(l<u)
{
j=partition(a,l,u);
quick_sort(a,l,j-1);
quick_sort(a,j+1,u);
}
}
int partition(int a[],int l,int u)
{
int v,i,j,temp;
v=a[l];
i=l;
j=u+1;
do
{
do
i++;
while(a[i]<v&&i<=u);
do
j--;
while(v<a[j]);
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}while(i<j);
a[l]=a[j];
a[j]=v;
return(j);
}
我尝试四处寻找解决方案,以了解为什么它拒绝为一百万个元素工作,但除了可能是空间问题之外一无所获,考虑到 MySort 正在工作,这在我看来不太可能。
至于我在输入 1000000 个元素时得到的输出究竟是什么,当我在命令行上执行这两个文件时,我得到的输出是(都运行两次):
C:\Users\Zac\Desktop>MySortTest <output.txt
Time Taken = 512129
C:\Users\Zac\Desktop>MySortTest <output.txt
Time Taken = 516131
C:\Users\Zac\Desktop>QuickSortTest <output.txt
C:\Users\Zac\Desktop>QuickSortTest <output.txt
C:\Users\Zac\Desktop>
但是,如果我只为 100000 个元素运行它们,这就是我得到的:
C:\Users\Zac\Desktop>MySortTest <output.txt
Time Taken = 76897.1
C:\Users\Zac\Desktop>MySortTest <output.txt
Time Taken = 74019.4
C:\Users\Zac\Desktop>QuickSortTest <output.txt
Time taken = 16880.2
C:\Users\Zac\Desktop>QuickSortTest <output.txt
Time taken = 18005.3
C:\Users\Zac\Desktop>
似乎工作正常。
我无能为力,任何建议都会很棒。
【问题讨论】:
-
可能是堆栈溢出。尝试使用
std::vector<int>而不是int[]。后者无论如何都不是便携式的。 -
int a[n];-- 不要这样做。使用std::vector<int> a(n);。你被你使用的编译器愚弄,相信int a[n]是有效的 C++ 代码。 -
Here is a link to your code failing to compile using Visual C++。错误如前面的 cmets 所述。另一位新程序员成为
g++可变长度数组恶作剧的受害者。 -
您的错误可能在这里:
int a[n];VLA 都不是 c++ 标准的一部分,并且大小有限。我希望这会导致堆栈溢出。 -
g++ 真的会在堆栈上分配 n == 100000 的
int a[n];吗?我不反对使用std::vector的建议,只是想知道 VLA 是否真的是问题所在。