堆排序

来源:互联网 发布:网络贷款 报警有用吗 编辑:程序博客网 时间:2024/06/16 01:20
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);
}




}

};


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
原创粉丝点击