堆的简单实现和应用

一、用数组存储的堆和由此堆上实现的简单排序。
虽然对排序保证了最坏情况下的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 }

 

posted @ 2013-10-13 20:06  YiminDu  阅读(220)  评论(0编辑  收藏  举报