zoukankan      html  css  js  c++  java
  • 堆的简单实现和应用

    一、用数组存储的堆和由此堆上实现的简单排序。
    虽然对排序保证了最坏情况下的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 }
  • 相关阅读:
    GCD
    Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
    systimestamp
    byte数组之间的赋值,byte和TCHAR数组的赋值
    如何修改hotspot默认信道
    Wifi的密码长度有何限制
    微信心跳机制
    如何内置iperf到手机中
    如何adb shell进入ctia模式
    本周推荐10款免费的网站模板设计
  • 原文地址:https://www.cnblogs.com/yimindu/p/3366981.html
Copyright © 2011-2022 走看看