堆排序
2015-08-18 10:40
190 查看
class Solution {
public:
void sift(int i,int m,vector<int>&a) //此函数只是调整,还未建堆;
{
int j=2*i;
while(j<=m)
{
if(j<m&&a[j+1]>a[j]) j++; //看到j+1就应该在判断j范围;
if(a[i]>a[j]) break; //最上面的节点满足,则下面的肯定满足;
else {
swap(a[i],a[j]);
i=j; //千万不要写成j=2*j;
j=2*i;
}
}
}
void heapsort(int n,vector<int>&a)
{
for(int i=n/2;i>=1;i--) //自底向上调整;建好堆;
sift(i,n,a);
for(int i=1;i<n;i++)
{
swap(a[1],a[n-i+1]); //a[1]与a
交换; 第一个跟最后一个交换;继续调整;
sift(1,n-i,a);
}
}
};
void main()
{
int a[10]={1,2,5,3,2,4,6,7,8,4};
vector<int>ivec;
ivec.assign(a,a+10);
ivec.insert(ivec.begin(),0); //堆排序是从1开始的;
vector<int>result;
Solution s;
int len=ivec.size();
s.heapsort(len-1,ivec);
for(int i=1;i<len;i++)
cout<<ivec[i]<<endl;
}
public:
void sift(int i,int m,vector<int>&a) //此函数只是调整,还未建堆;
{
int j=2*i;
while(j<=m)
{
if(j<m&&a[j+1]>a[j]) j++; //看到j+1就应该在判断j范围;
if(a[i]>a[j]) break; //最上面的节点满足,则下面的肯定满足;
else {
swap(a[i],a[j]);
i=j; //千万不要写成j=2*j;
j=2*i;
}
}
}
void heapsort(int n,vector<int>&a)
{
for(int i=n/2;i>=1;i--) //自底向上调整;建好堆;
sift(i,n,a);
for(int i=1;i<n;i++)
{
swap(a[1],a[n-i+1]); //a[1]与a
交换; 第一个跟最后一个交换;继续调整;
sift(1,n-i,a);
}
}
};
void main()
{
int a[10]={1,2,5,3,2,4,6,7,8,4};
vector<int>ivec;
ivec.assign(a,a+10);
ivec.insert(ivec.begin(),0); //堆排序是从1开始的;
vector<int>result;
Solution s;
int len=ivec.size();
s.heapsort(len-1,ivec);
for(int i=1;i<len;i++)
cout<<ivec[i]<<endl;
}
相关文章推荐
- Jenkins知识地图
- Java中类初始化的研究
- Dialog和ListView,progressBar的结合使用
- struts2中的OGNL
- 一个老菜鸟所理解的UX及产品流
- IOS开发之表视图(UITableView)
- NBUT 1225 NEW RDSP MODE I (规律+快速幂)
- Exchange 2016之启动Exchange EAC 性能控制台界面
- 欢迎使用CSDN-markdown编辑器
- AFNetworking使用
- 链式前向星
- (2)const对象和对象的const成员
- NYOJ 37 回文序列
- UE3 性能、分析及优化
- 苹果开发者后台的帮助文档
- HDU 3341 Lost's revenge (AC自动机 + DP)
- 迭代和递归 - leetcode 206. Reverse Linked List
- Bye,IE!服务互联网20年IE终于要退役了
- HW-找7(测试ok满分注意小于等于30000的条件)
- 【LeetCode】100. Same Tree