| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 292 人关注过本帖
标题:【请教】大家帮我看看这个堆排序有什么问题。多谢了。
只看楼主 加入收藏
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:1 
【请教】大家帮我看看这个堆排序有什么问题。多谢了。
void HeapAdjuse(int R[],int low,int high)
{
    int i,j,temp;
    i=low;
    j=2*i;
    temp=R[low];
    for(j=2*i;j<=high;j*=2)
    {
        if(j<high&&R[j+1]>R[j])
            j++;
        R[low]=R[j];
        low=j;
    }
    R[low]=temp;
}
void HeapSort(int R[],int n)
{
    int i,temp;
    for(i=n/2;i>0;i--)
        HeapAdjuse(R,i,n);
    for(i=n;i>1;i--)
    {
        temp=R[i];
        R[i]=R[1];
        R[1]=temp;
        HeapAdjuse(R,1,i-1);
    }
            
}
为什么得不到正确的排序结果,我按照严蔚敏的数据结构写的程序。请高手快点指点,多谢!
2011-06-24 22:03
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:20 
我自己写过一个堆排,你参考一下,都差不多的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
FILE *fin,*fout;
void file_start()
{
if((fin=fopen("hsort.in","r"))==NULL)
{
printf("Cannot open this file!\n");
getchar();
exit(0);
}
if((fout=fopen("hsort.out","w"))==NULL)
{
printf("Cannot open this file!\n");
getchar();
exit(0);
}
}
void sift(int startPos,int endPos,int number[])
{
 //startPos是完全二叉树(堆)中,当前要处理的节点编号
 //endPos是当前要处理的堆中的元素个数
 //number是堆本身
 //根据下面主调函数的实参,可以知道,startPos的值应该是长度为endPos的完全二叉树中的最后一个非叶子节点的编号
 int k=2*startPos+1,temp;//根据完全二叉树的性质,编号为startPos的节点的左孩子的编号应该是2*startPos+1,那么k就是startPos节点的左孩子节点
 temp=number[startPos];//保存当前父亲节点的值,有可能覆盖
 while(k<endPos)//如果还有中间节点没有处理完
 {
 if(k+1<endPos&&number[k]<number[k+1]) k++; //number[k]和number[k+1]分别是number[i]的左、右孩子,这是在找值最大的孩子
 if(temp<number[k])//如果孩子比其父节点的值都大的话,则覆盖父节点的值,看来这是要形成“大根堆”
 {
  number[startPos]=number[k];//覆盖操作
  startPos=k;//让节点指针移动到值交换之后的子节点处
  k=2*startPos+1;//k依然指向i的左孩子节点
 }
 else
 break;//如果没有交换,即number[i]、number[k]和number[k+1]所构成的堆本身满足大根堆,则不需要再向下继续了
 }
 number[startPos]=temp;//将函数一开始要移动的number[i]的值,移动到现在(可能移动、也可能没有移动)的number[i]里
}
void heap_sort(int number[],int n)
{
int i,temp=0;
for(i=n/2;i>=0;i--)
sift(i,n,number);
for(i=n-1;i>=0;i--)
{
  temp=number[i];
  number[i]=number[0];
  number[0]=temp;
  sift(0,i,number);
}
}
int main()
{
int i,number[10000]={0},n;
file_start();
fscanf(fin,"%d",&n);
for(i=0;i<n;i++)
fscanf(fin,"%d",&number[i]);
heap_sort(number,n);
for(i=0;i<n;i++)
fprintf(fout,"%d ",number[i]);
system("pause");
return 0;
}


欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-06-25 18:55
快速回复:【请教】大家帮我看看这个堆排序有什么问题。多谢了。
数据加载中...
 
   



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

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