关闭

堆排序之二

262人阅读 评论(0) 收藏 举报
分类:

昨天后来做堆排序算法时候卡住了,今天解决了半天,最后发现居然是一个<=还是<的问题。这样的错误已经至少两次了,为啥就是不能避免呢。

利用昨天做的heapify函数,实现堆排序。原则就是每次形成一个大根堆,然后把最大的扔到最后去,再对前面剩下的那些排序,生成大根堆,每次这样,直到最后大根堆中只有一个元素。

#include<iostream>
using namespace std;


int N(11);


void heapify(int a[],int i)
{
int l,r,largest,temp;
l=2*i;
r=2*i+1;
//find the largest one in i,l,r.
if (l<N && a[l]>a[i])
largest=l;
else largest=i;
if(r<N && a[r]>a[largest])
largest=r;
//cout<<"largest="<<largest<<endl;
//if i is not the largest one,exchange.
if(largest!=i)
{temp=a[i];
a[i]=a[largest];
a[largest]=temp;
cout<<"largest="<<largest<<" "<<a[largest]<<endl;

//use largest to do the next check.
heapify(a,largest);
}
//else heapify(a,l);
}


int main()
{
int a[]={0,4,1,3,2,16,9,10,14,8,7};
for(int i=N;i>0;i--)
{
heapify(a,i);
}
for(int j=1;j<N;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;


for(int t=N-1;t>=1;t--)

{
N--;
int tt;
tt=a[t];
a[t]=a[1];
a[1]=tt;
cout<<"N="<<N<<" ";
cout<<"a["<<t<<"]="<<a[t]<<"  a[1]="<<a[1]<<endl;
heapify(a,1);


for(int j=1;j<11;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
}

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21824次
    • 积分:696
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条