【发布时间】:2015-01-28 08:05:48
【问题描述】:
我上次在比较插入排序的两种不同实现的运行时间时发布了一个类似的问题。我现在也有类似的问题。我知道堆排序的复杂度是 O(nlogn),与一般情况下的快速排序相同。但这是我对随机生成的大小为 10,000 的整数数组进行排序时的结果。
快速排序:执行时间:0.005288
堆排序:执行时间:0.234245
如您所见,我的堆排序花费的时间比应有的要多。
这是我的 max_heapify、build_max_heap 和 heapsort 函数的代码:
void max_heapify(int *a,int n,int i)
{
int largest = 0;
if((2*i)<=n && a[2*i] > a[i]) largest = 2*i;
else largest = i;
if((2*i+1)<=n && a[2*i+1] > a[largest]) largest = 2*i+1;
if(largest != i)
{
swap(a[i],a[largest]);
max_heapify(a,n,largest);
}
}
void build_max_heap(int *a,int n)
{
for(int i=1;i<=n/2;i++)
{
max_heapify(a,n,i);
}
}
void heapsort(int *a,int n)
{
while(n>0)
{
build_max_heap(a,n);
swap(a[1],a[n--]);
}
}
谁能告诉我实施中的缺陷?该代码有效。我亲自针对较小的样本量对其进行了测试,但效率不高。
感谢任何帮助。谢谢!
【问题讨论】:
-
尝试对 许多 组随机数据运行这些,并查看平均值。
-
@ScottHunter 问题是,无论您怎么看,运行时间都与应有的时间相差甚远。两种 O(nlogn) 排序算法的运行时间应该不会有这么大的差异。
-
仅仅因为两种算法具有相同的时间复杂度,并不能保证它们具有相同的运行时间。他们的运行时间很可能会有所不同。
-
您是否尝试过分析。例如,您可能会在 heapify 上花费大量时间。
标签: algorithm sorting heap quicksort heapsort