堆的简单实现和应用
一、用数组存储的堆和由此堆上实现的简单排序。
虽然对排序保证了最坏情况下的O(n log n)的性能,但对于常见输入,最快的堆排序也比简单快速排序慢。
1 #include<iostream> 2 using namespace std; 3 int x[100]; 4 void siftup(int n) 5 { 6 int p; 7 int i = n; 8 while(1){ 9 if(i == 1) 10 break; 11 p = i / 2; 12 if(x[p] <= x[i]) 13 break; 14 swap(x[p] , x[i]); 15 i = p; 16 } 17 } 18 void siftdown(int n){ 19 int i = 1; 20 while(1){ 21 int c = 2 * i; 22 if(c > n){ 23 break; 24 } 25 if(c + 1 <= n){ 26 if(x[c + 1] < x[c]) 27 c++; 28 } 29 if(x[i] <= x[c]) 30 break; 31 swap(x[c] , x[i]); 32 i = c; 33 } 34 } 35 int main() 36 { 37 int n; 38 cin>>n; 39 for(int i = 1 ; i <= n; i++){ 40 cin>>x[i]; 41 siftup(i); 42 } 43 while(n){ 44 cout<<x[1]<<" "; 45 if(n == 1) 46 break; 47 x[1] = x[n--]; 48 siftdown(n); 49 } 50 cout<<endl; 51 return 0; 52 }
二、用堆和c++模板实现的优先级队列
1 #include<iostream> 2 using namespace std; 3 template 4 class priqueue 5 { 6 private : 7 int n , maxsize; 8 T *x; 9 void swap(int i , int j){ 10 T t = x[i] ; 11 x[i] = x[j]; 12 x[j] = t; 13 } 14 public: 15 priqueue(int m) { 16 maxsize = m; 17 x = new T[maxsize + 1]; 18 n= 0; 19 } 20 void insert(T t){ 21 int i ,p; 22 x[++n] = t; 23 for(int i = n ; i > 1 && x[p = i / 2] > x[i] ; i = p ) 24 swap(p , i); 25 } 26 27 T extractmin(){ 28 int i , c; 29 T t = x[1]; 30 x[1] = x[n--]; 31 for(i = 1 ; (c = 2 * i) <= n ; i = c){ 32 if(c + 1 <= n && x[c + 1] < x[c]) 33 c++; 34 if(x[i] <= x[c] ) 35 break; 36 swap(c , i); 37 } 38 return t; 39 } 40 }; 41 42 int main() 43 { 44 priqueue q(100); 45 int t; 46 for(int i = 0; i < 10 ; i ++){ 47 cin>>t; 48 q.insert(t); 49 } 50 for(int i = 0; i < 10 ; i ++){ 51 cout<<q.extractmin()<<" "; 52 } 53 cout<<endl; 54 return 0; 55 }