zoukankan      html  css  js  c++  java
  • 算法导论6.57习题解答

    CLRS 6.5-7 :
    HEAP-DELETE(A, i)操作将结点i中的项从堆A中删去。对含n个元素的最大堆,请给出时间为O(lgn)的HEAP-DELETE的实现。
    算法思想:
    对即将被删的i处的元素设置为堆中末尾的元素,同时堆的大小减1.
    此题同时附带6.2-5的解答
    代码如下:

      1 #include <iostream>
      2 using namespace std;
      3 //修正i的位置,在此处已经假设i的子节点都是堆
      4 static void max_heapify(int*&a, int i, int length);
      5 //建立数组的堆
      6 void build_max_heap(int*&a, int length);
      7 //利用堆对数组重新排序,总是拿第一个和最后一个对调,数组长度减一
      8 void heap_sort(int*&a, int length);
      9 //删除ith元素
     10 void heap_delete(int*&a, int i, int length);
     11 //插入x
     12 void heap_insert(int*&a, int x, int length);
     13 //将ith位置上的数增加到key
     14 void increase_key(int*&a, int i, int key);
     15 
     16 int main()
     17 {
     18     const int LEN =10;
     19     int b[10] = {12, 43, 0, -4, 98, 75, 64, 88, 5, 32};
     20     int* a = new int[LEN];
     21     for(int i =0; i < LEN; i++)
     22         a[i] = b[i];
     23     heap_sort(a, LEN);
     24     for(int i =0; i < LEN; i++)
     25         cout<<a[i]<<endl;
     26     cout<<"****"<<endl;
     27 
     28     increase_key(a, 7, 100);
     29     heap_sort(a, LEN);
     30     for(int i =0; i < LEN; i++)
     31         cout<<a[i]<<endl;
     32     cout<<"****"<<endl;
     33 
     34     heap_insert(a, 10, LEN);
     35     heap_sort(a, LEN + 1);
     36     for(int i =0; i < LEN + 1; i++)
     37         cout<<a[i]<<endl;
     38     cout<<"****"<<endl;
     39 
     40     heap_delete(a, 1, LEN + 1);
     41     heap_sort(a, LEN);
     42     for(int i =0; i < LEN; i++)
     43         cout<<a[i]<<endl;
     44     cout<<"****"<<endl;
     45     return 0;
     46 }
     47 
     48 static void max_heapify(int*&a, int i, int length)
     49 {
     50     int largest = i;
     51     while(largest <= length -1) {
     52         int left =2*largest +1;
     53         int right =2*largest +2;
     54         int temp = largest;
     55         if(left <= length -1&& a[left] > a[largest]) {
     56             largest = left;
     57         }
     58         if(right <= length -1&& a[right] > a[largest]) {
     59             largest = right;
     60         }
     61         if(largest != temp) {
     62             int exchange = a[largest];
     63             a[largest] = a[temp];
     64             a[temp] = exchange;
     65         } else {
     66             break;
     67         }
     68     }
     69 }
     70 
     71 void build_max_heap(int*&a, int length)
     72 {
     73     int root = length/2-1;
     74     for(int i = root; i >=0; i--)
     75         max_heapify(a, i, length);
     76 }
     77 
     78 void heap_sort(int*&a, int length)
     79 {
     80     build_max_heap(a, length);
     81     for(int i = length -1; i >=1; i--) {
     82         int temp = a[0];
     83         a[0] = a[i];
     84         a[i] = temp;
     85         max_heapify(a, 0, i);
     86     }
     87 }
     88 
     89 void heap_delete(int*&a, int i, int length)
     90 {
     91     if(i != length -1) {
     92         a[i] = a[length -1];
     93         max_heapify(a, i, length); 
     94     }
     95 }
     96 
     97 void heap_insert(int*&a, int x, int length)
     98 {
     99     int* temp = a;
    100     a = new int[length +1];
    101     for(int i =0; i < length; i++)
    102         a[i] = temp[i];
    103     delete temp;
    104     //用-10000000代替负无穷
    105     a[length] =-10000000;
    106     increase_key(a, length, x);
    107 }
    108 
    109 void increase_key(int*&a, int i, int key)
    110 {
    111     if(a[i] > key) {
    112         cout<<"key should be larger than a[i]"<<endl;
    113     } else {
    114         int parent = (i -1)/2;
    115         a[i] = key;
    116         while(parent >= 0 && a[parent] < key) {
    117             int temp = a[parent];
    118             a[parent] = key;
    119             a[i] = temp;
    120             i = parent;
    121             parent = (i -1)/2;
    122         }
    123     }
    124 }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    在AS/400上根据日期生成星期几
    如何删除含无效字符的文件
    在CL中使用SST或者SUBSTRING
    取网络属性
    如何在程序中获取系统ASP使用率等系统状态信息
    在CL中使用ELSE
    在CL中读一个文件
    如何在FTP命令行执行AS/400命令
    广告悬停功能
    关于Grouping, Rollup,cube,
  • 原文地址:https://www.cnblogs.com/null00/p/2065078.html
Copyright © 2011-2022 走看看