堆排序
来源:互联网 发布:网络贷款 报警有用吗 编辑:程序博客网 时间:2024/06/16 05:08
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[n]交换; 第一个跟最后一个交换;继续调整;
sift(1,n-i,a);
}
}
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[n]交换; 第一个跟最后一个交换;继续调整;
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;
}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Java中类初始化的研究
- jquery获取当前时间
- HDOJ 2066 一个人的旅行(最短路,dijkstra算法)
- Jenkins知识地图
- Domino/Xpages Bootstrap 动态生成首页功能
- 堆排序
- 关于session监听浏览器关闭服务器执行destory的证实
- YTU 2238: 括号匹配(栈和队列)
- C++之内存分配
- (3)用const修饰函数的参数和函数的返回值
- Flume Interceptors
- 19.6 Restrictions and Limitations on Partitioning
- 黑马程序员_javaIO流下
- 使用vs 将wsdl文件自动生成代理类