【发布时间】:2014-12-30 15:07:09
【问题描述】:
我一直在做作业,比较一堆排序算法,我遇到了一个奇怪的现象。事情正如预期的那样:插入排序赢得了诸如 20 个整数的表之类的东西,否则快速排序优于堆排序和归并排序。最多包含 500,000 个整数的表(存储在内存中)。对于 5,000,000 个整数(仍存储在内存中),快速排序突然变得比堆排序和归并排序更糟。数字始终是均匀分布的随机数,windows 虚拟内存关闭。有人知道这可能是什么原因吗?
void quicksortit(T *tab,int s) {
if (s==0 || s==1) return;
T tmp;
if (s==2) {
if (tab[0]>tab[1]) {
tmp=tab[0];
tab[0]=tab[1];
tab[1]=tmp;
}
return;
}
T pivot=tab[s-1];
T *f1,*f2;
f1=f2=tab;
for(int i=0;i<s;i++)
if (*f2>pivot)
f2++;
else {
tmp=*f1;
*f1=*f2;
*f2=tmp;
f1++; f2++;
}
quicksortit(tab,(f1-1)-tab);
quicksortit(f1,f2-f1);
};
【问题讨论】:
-
我不知道您使用的是什么系统,但我的第一个猜测是由于数据集较大,您遇到了更多的处理器缓存未命中。
-
对于大型数组,选择一个好的枢轴值比简单地运行算法更重要。试试
T pivot=tab[s/2];看看有什么帮助 -
每次运行代码时都会更改种子值,还是始终使用相同的初始 500 万大小数组?
-
你说“突然更糟”,但你没有具体说明有多突然,以及有多糟。例如,它在 4999999 时是否更快,然后在 5000000 时更差?如果逐渐恶化,您能否描述或展示性能曲线的样子?
-
@jxd: 肯定是reseeded,2,000,000 qs 运行时间几乎是mergesort 的一半,3000,000 是一样的。
标签: c++ quicksort large-data