我根据CLRS在C中实现了一个堆排序算法。但是,我无法获得排序的输出。你能看看我的代码有什么问题吗?函数maxheap和buildmaxheap工作。我无法理解代码有什么问题。
代码应该堆叠数组元素。我觉得heapsort()函数中有一个错误,因为maxheap和buildmaxheap工作得很好。
我得到的最后输出是
1 1 1 1 2 1 2 2 1 1但是预期的产出应该是
1 2 3 4 7 8 9 10 14 16守则:
#include<stdlib.h>
#include<stdio.h>
#define maxn 11
int n=10;
int parent(int i)
{
return i/2;
}
int left(int i)
{
return 2*i+0;
}
int right(int i)
{
return 2*i+1+0;
}
void max_heap(int x[],int i,int heapsize)
{
int largest;
int l=left(i);
int r=right(i);
if (l<=heapsize && x[l]>x[i]){
largest=l;
}
else
{
largest=i;
}
if (r<=heapsize && x[r]>x[largest]){
largest=r;
}
if (largest!=i)
{
int s=x[i];x[i]=x[largest];x[largest]=s;
max_heap(x,largest,heapsize);
}
}
void buildmaxheap(int x[],int heapsize)
{
int i;
for(i=5;i>=1;i--)
max_heap(x,i,heapsize);
}
void heapsort(int x[])
{
buildmaxheap(x,10);
int i,t,heapsize=10;
for(i=10;i>=2;i--)
{
int s=x[i];x[1]=x[i];x[i]=s;
heapsize--;
/*
printf("%d",heapsize);
*/
max_heap(x,i,heapsize);
}
for(i=1;i<=10;i++)
printf("%d\t",x[i]);
}
int main()
{
int x[maxn],i;
x[1]=16;
x[2]=4;
x[3]=10;
x[4]=14;
x[5]=7;
x[6]=9;
x[7]=3;
x[8]=2;
x[9]=8;
x[10]=1;
heapsort(x);
/*
for(i=1;i<=10;i++)
printf("%d\t",x[i]);
*/
}发布于 2015-06-17 23:06:25
堆中缺乏逻辑。任何排序算法都必须比较两个值,并且做一件事情要比它少,另一件事情要做得更大,如果相同的话,就不要去管它。目前,您会多次使用索引1自动交换比较器。
我不明白为什么它会导致随机的1和2,但是它看起来很坏,所以我不会再给你时间,直到你再试一次。
在c中,数组索引从0开始,不要在这个小的10个节点的困境中避免它--这并不是什么大问题。但是,如果你不自动认为零是第一,你会付出很大的时间。
发布于 2015-06-17 23:35:29
这一行:
int s=x[i];x[1]=x[i];x[i]=s;看上去它是在做交换,但它搞混了。查看索引并考虑顺序。
在你解决了这个问题之后,还有另外一个bug。我没有这本书,所以我不知道它到底让你做什么,但是我相信你需要在删除元素之后从根开始修复堆属性,而你的代码没有这样做。
https://stackoverflow.com/questions/30898881
复制相似问题