基于vector为储存结构的堆排序:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> v;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int k;
cin>>k;
v.push_back(k);
}
vector<int>::iterator it;
//cout<<"正序遍历:\t";
for(it=v.begin();it!=v.end();it++){ /*正序遍历*/
cout<<*it<<" ";
}
cout<<endl;//cout<<"逆序遍历:\t";
for(it=v.end()-1;it!=v.begin()-1;it--){ /*逆序遍历1*/
cout<<*it<<" ";
}
cout<<endl;//cout<<"逆序遍历(逆向迭代器):\t";
for(vector<int>::reverse_iterator its=v.rbegin();its!=v.rend();its++){ /*逆序遍历2(反向迭代器)*/
cout<<*its<<" ";
}
cout<<endl;
make_heap(v.begin(),v.end(),greater<int>()); /*建立小顶堆,若想建立大顶堆,第三个参数改为less<int>()*/
sort_heap(v.begin(),v.end(),greater<int>()); /*进行降序排序,若想升序,第三个参数改为less<int>()*/
for(it=v.begin();it!=v.end();it++){ /*正序遍历(排好的降序序列)*/
cout<<*it<<" ";
}
cout<<endl;
for(it=v.end()-1;it!=v.begin()-1;it--){ /*逆序遍历(排好的升序序列)*/
cout<<*it<<" ";
}
cout<<endl;
system("pause");
return 0;
}
基于数组的堆排序:
#include<iostream>
#include<algorithm>
#include<vector>
#define maxsize 100
using namespace std;
int v[maxsize];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
}
make_heap(v+1,v+n+1,greater<int>()); /*建立小顶堆,若想建立大顶堆,第三个参数改为less<int>()*/
sort_heap(v+1,v+n+1,greater<int>()); /*进行降序排序,若想升序,第三个参数改为less<int>()*/
for(int i=1;i<=n;i++){ /*正序遍历(排好的降序序列)*/
cout<<v[i]<<" ";
}
cout<<endl;
for(int i=n;i>=1;i--){ /*逆序遍历(排好的升序序列)*/
cout<<v[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
注:vector的end()函数取的是最后一个元素的后一个位置的指针,因此操作上要注意书写方式,尤其是在用顺序迭代器进行逆序输出时。并且由基于vector的堆排序得知,堆排序的前两个参数取的是地址因此在基于数组的堆排序中前两个参数都应该是地址,另外结束位置应该是数组最后一个数字后面一个的地址,否则排序会忽略最后一个数,这一点和sort函数是一样的。