堆排序 O(nlogn)
堆与 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<ctime> 5 #include<cmath> 6 #include<cassert> 7 using namespace std; 8 template<class T> 9 class MaxHeap{ 10 private: 11 T*data;//数据元素 12 int count;//数量 13 int capacity; 14 //从结点start开始,自下向上比较调整 15 void shiftup(int start){ 16 while(start>1&&data[start/2]<data[start]){ 17 swap(data[start/2],data[start]); 18 start/=2; 19 } 20 } 21 void shiftdown(int k){ 22 while(2*k<=count){//有孩子 23 int j=2*k; //在这轮循环中data[k]要和data[j]交换位置 24 if(j+1<=count&&data[j+1]>data[j]) j=k+1; 25 if(data[k]>=data[j]) break; 26 swap(data[k],data[j]);