写了个堆排序算法 为什么输出不了结果呢?

lc19890326 2008-05-22 01:20:34
堆排序代码如下

#include<iostream>
#include<vector>
#include<list>
using namespace std;

//以下三个函数返回i节点的父节点 左孩子 右孩子节点位置
int Parent(int i)
{
if(i%2==0)
return i/2-1;
else
return i/2;
}

int Left(int i)
{
return 2*i+1;
}

int Right(int i)
{
return 2*i+2;
}

void swap(int &a,int &b)
{
int temp;
temp=a;a=b;b=temp;
}

//以i节点为父节点的树为最大堆
void Max_Heapify(vector<int> &a,int i)
{
int l=Left(i),r=Right(i),largest;
if(l<a.size()&&a.at(l)>a.at(i))
largest=l;
else
largest=i;
if(r<a.size()&&a.at(r)>a.at(largest))
largest=l;
if(largest!=i)
swap(a.at(i),a.at(largest));
Max_Heapify(a,largest); //递归子树,使子树为最大堆
}

//由数组a构造最大堆
void Build_Max_Heap(vector<int> &a)
{
int n=a.size();
for(int i=n/2-1;i>=0;--i)
Max_Heapify(a,i); //遍历每个节点 使每个节点的子树都成为最大堆
}

//堆排序
void Heap_Sort(vector<int> &a,list<int> &result)
{
Build_Max_Heap(a);

for(int i=a.size()-1;i>=0;--i)
{
swap(a.at(0),a.at(i)); //a[0]是该堆中的最大元素,与最后一个元素交换,然后压入结果数组result
result.push_front(a.at(i));
a.erase(a.end()-1); //使最后一个元素脱离堆
Max_Heapify(a,0);//保持最大堆
}
}

int main()
{
int a[10]={4,1,3,2,16,9,10,14,8,7};
vector<int> ivec(a,a+9);
list<int> ilst;
Heap_Sort(ivec,ilst);
for(list<int>::iterator iter=ilst.begin();iter!=ilst.end();++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}
...全文
122 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lc19890326 2008-05-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wbf402 的回复:]
我不是来接分的!

这样的错误是很正常的,不过也不要困为它是正常而不重视它,要养成一个好的习惯————自己写完了先不要去编译,先自己按照
先前设计好的算法也好,逻辑也好,每一条的去对照一下,再去编译,这样一来,你这样的错误就基本不会发生了。
[/Quote]

我知道 这种细节我会多加重视的 谢谢
xjy1204 2008-05-22
  • 打赏
  • 举报
回复
JF的人还真不少呵呵
不过楼主解决了自己程序的问题应该多少还是有收获的:)
wbf402 2008-05-22
  • 打赏
  • 举报
回复
我不是来接分的!

这样的错误是很正常的,不过也不要困为它是正常而不重视它,要养成一个好的习惯————自己写完了先不要去编译,先自己按照
先前设计好的算法也好,逻辑也好,每一条的去对照一下,再去编译,这样一来,你这样的错误就基本不会发生了。
rhwfyf 2008-05-22
  • 打赏
  • 举报
回复
接分
coverallwangp 2008-05-22
  • 打赏
  • 举报
回复
结贴吧!
  • 打赏
  • 举报
回复
jf
lc19890326 2008-05-22
  • 打赏
  • 举报
回复
自己搞定了
if(r<a.size()&&a.at(r)>a.at(largest))
largest=l;
r 写成了l

真是低级错误 ~

等人进来接分了就结贴
lc19890326 2008-05-22
  • 打赏
  • 举报
回复
自己发现一个问题

Max_Heapify函数中递归写错了

应该写在if(largest!=i)中
改为if(largest!=i)
{
swap(a.at(i),a.at(largest));
Max_Heapify(a,largest); //递归子树,使子树为最大堆
}
else
return ;
但是有数了 结果不正确
继续看
希望有人帮忙
lc19890326 2008-05-22
  • 打赏
  • 举报
回复
编译没问题 但是没有输出
请问怎么回事
谢谢

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧