写一个堆排序
程序代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Heap_sort { public: void build_heap(vector<int> &v); void adjust_heap(vector<int> &v,vector<int>::iterator i,vector<int>::iterator dis); void sort_heap(vector<int> &v); vector<int>::iterator left_child(vector<int> &v,vector<int>::iterator i); vector<int>::iterator right_child(vector<int> &v,vector<int>::iterator i); }; //获取左节点下标 vector<int>::iterator Heap_sort::left_child(vector<int> &v,vector<int>::iterator i) { advance(i,distance(v.begin(),i)); return i; } //获取右节点下标 vector<int>::iterator Heap_sort::right_child(vector<int> &v,vector<int>::iterator i) { advance(i,distance(v.begin(),i)+1); return i; } //调整堆 void Heap_sort::adjust_heap(vector<int> &v,vector<int>::iterator i,vector<int>::iterator dis) { vector<int>::iterator l=left_child(v,i); vector<int>::iterator r=right_child(v,i); vector<int>::iterator largest=v.begin(); if((*i)<(*l)&&(l<dis)) largest=l; else largest=i; if((*largest)<(*r)&&(r<dis)) largest=r; //建的是大顶锥 if(largest!=i) { swap(*largest,*i); adjust_heap(v,largest,dis); } } //初建堆 void Heap_sort::build_heap(vector<int> &v) { for(vector<int>::iterator i=v.begin()+v.size()/2-1;i!=--v.begin();--i) adjust_heap(v,i,v.end()); } //堆排序 void Heap_sort::sort_heap(vector<int> &v) { build_heap(v);//堆排序之前应该先初建堆 for(auto i=--v.end();i!=--v.begin();--i) { swap(*i,*(v.begin()));//交换第一个元素(最大的)与最后一个元素 adjust_heap(v,v.begin(),i);//交换完之后第一个元素不是最大的,要调整堆使第一个元素最大 } } int main() { vector<int> v{70,30,40,10,80,20,90,100,75,60,45};//看做完全二叉树 Heap_sort hs;//创建堆排序的对象 hs.sort_heap(v); for(auto i:v) cout<<i<<" "; cout<<endl; return 0; }