堆排序 O(nlogn)

爷,独闯天下 提交于 2019-11-26 08:57:55
堆与
 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]); 
27                 k=j; 
28             }
29         }
30     public:
31         MaxHeap(int capacity){//构造函数 
32            data=new T[capacity+1];//因为数组在这里从1开始 
33            count=0; 
34            this->capacity=capacity;
35         }
36         ~MaxHeap(){delete []data;}//析构函数
37         //返回当前堆中的元素个数 
38         int size(){return count;}
39         //判断是否为空 
40         bool isEmpty(){return count==0;}
41         //插入item 
42         void insert(T item){
43             assert(count+1<=capacity);
44             data[count+1]=item;//暂存
45             count++; 
46             shiftup(count);
47         }
48         //取出并删去最大值(根) 
49         T extractMax(){
50             assert(count>0);
51             T ret=data[1];
52             swap(data[1],data[count]);
53             count--;
54             shiftdown(1);
55             return ret;
56         } 
57         //打印函数 
58         void print(){
59             for(int i=1;i<=count;i++) cout<<data[i]<<endl;
60         }
61 };
62 //堆排序函数 
63 template<class T>
64 void Heapsort(T arr[],int n){
65     MaxHeap<T>maxheap(n);
66     for(int i=0;i<n;i++) maxheap.insert(arr[i]);
67     //从小到大 
68     for(int i=n-1;i>=0;i--) arr[i]=maxheap.extractMax();
69 }
70 int main(){
71     MaxHeap<int>maxheap(100);
72     cout<<maxheap.size()<<endl;
73     srand(time(NULL));
74     for(int i=0;i<15;i++) maxheap.insert(rand()%100);//0到100前闭后开的随机数
75     maxheap.print();
76     while(!maxheap.isEmpty()) cout<<maxheap.extractMax()<<" ";
77     cout<<endl;
78     return 0;
79 } 
堆排序

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!