您的位置:首页 > 其它

堆排序

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: