| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 758 人关注过本帖
标题:一个大顶堆排序问题
只看楼主 加入收藏
a13468954732
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-9-25
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
一个大顶堆排序问题
程序代码:
程序执行没有错误 但一运行就出错误 希望朋友帮忙看下 谢谢!!!


#include<stdio.h>
#include<stdlib.h>
#define length 6//待排序数个数

int left(int i){//i为插入位置 求i的左孩子
    return 2*i;
}
int right(int i){//右孩子
    return 2*i+1;
}
int parent(int i){//父节点
    return i/2;
}
void swap(int *a,int *b){//交换两个数的值
    int temp;
    temp=*a;*a=*b;*b=temp;
}

void max_heapify(int a[],int i,int heapsize){//将i位置调整 满足大顶堆的性质
   
    int l=left(i);
    int r=right(i);
    int largest,temp;
    if(l<=heapsize&&a[l]>a[i])
        largest=l;
    else
        largest=r;
    if(r<=heapsize&&a[r]>a[largest])
        largest=r;
    if(largest!=i){
        swap(&i,&largest);
        max_heapify(a,largest,heapsize);
    }
}

void build_max_heapify(int a[],int heapsize){//建立大顶堆
   
    int i;
    for(i=length/2;i>=1;i--)
        max_heapify(a,i,heapsize);
}

void heapsort(int a[],int heapsize){//堆排序

    int i,temp;
    build_max_heapify(a,heapsize);
    for(i=heapsize;i>=2;i--){
        temp=a[1];a[1]=a[i];a[i]=temp;
        heapsize--;
        max_heapify(a,1,heapsize);
    }
}

int main(){
    int i,a[length]={1,2,3,4,5,6};
    int heapsize=length;
    heapsort(a ,heapsize);
    for(i=1;i<=length;i++)
        printf("%d ",a[i]);
    return 0;
}



搜索更多相关主题的帖子: 朋友 
2010-10-17 20:32
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:10 
“执行没错”和“运行出错”这两个句话怎么理解?


排序就是比较麻烦,几乎不可能一次就写对的,自己逐个对几个函数一一盘查,缩小排错范围,看看每个是不是都完成了各个该完成的工作。
静态查代码如果看不出错的话,就调试一下。

调试能力要练,对以后编程很有帮助的。别人查出错误,根别人写了个正确的函数一样。很多东西不如自己动手学得快。
2010-10-17 23:17
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
程序代码:
void heap_sort(int a[], int n)
{
    int i, c, r, t;
    if (n < 2) return;

    /* make heap */
    for (i = (n-1) / 2; i >= 0; i--)
    {
        for (c = i; 2 * c + 1 < n; c = r) {
            r = 2 * c + 1;
            if (r+1 < n && a[r] < a[r+1]) ++r;
            if (a[c] >= a[r]) break;
            t = a[c]; a[c] = a[r]; a[r] = t;
        }
    }
    /* sort heap */
    for (i = n-1; i > 0; i--)
    {
        t = a[i]; a[i] = a[0];
        for (c = 0; c * 2 + 1 < i; c = r) {
            r = c * 2 + 1;
            if (r+1 < i && a[r] < a[r+1]) ++r;
            if (t >= a[r]) break;
            a[c] = a[r];
        }
        a[c] = t;
    }
}

这是我以前写的,你可以对比一下不同的写法有什么区别。
编代码和调代码的能力都是磨练出来的。尤其是初学的时候,一定要下点功夫呀。加油哟~~
2010-10-17 23:19
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:10 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define length 6//待排序数个数

int left(int i){//i为插入位置 求i的左孩子
    return 2*i+1;
}
int right(int i){//右孩子
    return 2*i+2;
}
int parent(int i){//父节点
    return i/2;
}
void swap(int *a,int *b){//交换两个数的值
    int temp;
    temp=*a;*a=*b;*b=temp;
}

void max_heapify(int a[],int i,int heapsize)
{//将i位置调整 满足大顶堆的性质
  
    /*int l=left(i);
    int r=right(i);
    int largest,temp;
    if(l<=heapsize&&a[l]>a[i])
        largest=l;
    else
        largest=r;
    if((l<heapsize)&&(a[l]<a[r]))

    if(r<=heapsize&&a[r]>a[largest])
        largest=r;
    if(largest!=i){
        swap(&i,&largest);
        max_heapify(a,largest,heapsize);
    }*/

    int child=left(i);
    int temp=a[i];
    while(child<=heapsize)
    {
        if((child<heapsize)&&(a[child]<a[child+1]))
            child++;
        if(temp>a[child])
            break;
        a[(child-1)/2]=a[child];
        child=left(child);
    }
    a[(child-1)/2]=temp;
}



void build_max_heapify(int a[],int heapsize){//建立大顶堆
  
    int i;
    for(i=(length-2)/2;i>=0;i--)
        max_heapify(a,i,heapsize-1);
}

void heapsort(int a[],int heapsize){//堆排序

    int i,temp;
    build_max_heapify(a,heapsize);
    for(i=heapsize-1;i>0;i--)
    {
        temp=a[0];a[0]=a[i];a[i]=temp;
        max_heapify(a,0,i-1);
    }
}

int main()
{
    int i,a[length]={1,3,2,4,5,6};
    int heapsize=length;
    heapsort(a ,heapsize);
    for(i=0;i<length;i++)             
        printf("%d ",a[i]);
    return 0;
}




帮你改了下,对照看一下!好多低级错误啊!

If You Want Something, Go Get It, Period.
2010-10-18 22:34
快速回复:一个大顶堆排序问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037304 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved