#include<iostream> #include <cmath> #include<vector> using namespace std; template <class T> void max_heap(T* heap, int i) //heap[0]存储堆的大小 { int l=2*i; //l为左孩子的结点编号 int r=2*i+1; //r为右孩子的结点编号 int largest=i; int heap_size=heap[0]; T temp; if(l<=heap_size && heap[l]>heap[i]) largest=l; if(r<=heap_size && heap[r]>heap[largest]) largest=r; if(largest != i){ temp = heap[i]; heap[i] = heap[largest]; heap[largest] = temp; max_heap(heap, largest); } } template <class T> void build_max_heap(T* heap) { int heap_size=heap[0]; for (int i=floor(heap_size/2); i>=1; --i) max_heap(heap,i); } template <class T> void heap_sort(T* heap) { T temp; int heap_size=heap[0]; build_max_heap(heap); for (int i=heap_size; i>=2; --i) { temp=heap[1]; heap[1]=heap[i]; heap[i]=temp; heap[0]--; max_heap(heap,1); } } int main() { int a[10]={9,8,2,7,6,5,3,4,9,0}; //vector<int> a(9,8); //int a[10]={8,0,8,7,6,5,3,4,2,9}; //max_heap(a,1); //build_max_heap(a); heap_sort(a); for (int i=1; i<=9; i++) cout<<a[i]<<' '; cout<<endl; return 0; }