首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆排序算法CLRS

堆排序算法CLRS
EN

Stack Overflow用户
提问于 2015-06-17 17:54:52
回答 2查看 422关注 0票数 0

我根据CLRS在C中实现了一个堆排序算法。但是,我无法获得排序的输出。你能看看我的代码有什么问题吗?函数maxheapbuildmaxheap工作。我无法理解代码有什么问题。

代码应该堆叠数组元素。我觉得heapsort()函数中有一个错误,因为maxheapbuildmaxheap工作得很好。

我得到的最后输出是

代码语言:javascript
复制
1 1 1 1 2 1 2 2 1 1

但是预期的产出应该是

代码语言:javascript
复制
1 2 3 4 7 8 9 10 14 16

守则:

代码语言:javascript
复制
#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]);
     */
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 23:06:25

堆中缺乏逻辑。任何排序算法都必须比较两个值,并且做一件事情要比它少,另一件事情要做得更大,如果相同的话,就不要去管它。目前,您会多次使用索引1自动交换比较器。

我不明白为什么它会导致随机的1和2,但是它看起来很坏,所以我不会再给你时间,直到你再试一次。

在c中,数组索引从0开始,不要在这个小的10个节点的困境中避免它--这并不是什么大问题。但是,如果你不自动认为零是第一,你会付出很大的时间。

票数 0
EN

Stack Overflow用户

发布于 2015-06-17 23:35:29

这一行:

代码语言:javascript
复制
int s=x[i];x[1]=x[i];x[i]=s;

看上去它是在做交换,但它搞混了。查看索引并考虑顺序。

在你解决了这个问题之后,还有另外一个bug。我没有这本书,所以我不知道它到底让你做什么,但是我相信你需要在删除元素之后从根开始修复堆属性,而你的代码没有这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30898881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档