Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49148
  • 博文数量: 45
  • 博客积分: 1112
  • 博客等级: 少尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-03 11:47
文章分类

全部博文(45)

文章存档

2013年(45)

我的朋友

分类: C/C++

2013-01-04 23:32:22


  1. /*  Subject: Heap_sort   Date : 2012-01-30
  2.     个人感觉 : 建堆 -> 堆化 -> 堆排 -> 堆化 -> 堆排 -> 堆化 ......  */
  3. #include <iostream>
  4. #include <cstring>
  5. #include <vector>
  6. #include <queue>
  7. #include <algorithm>
  8. #define Bug cout << "here\n";

  9. using namespace std;
  10. const int N = 105;

  11. int a[N];

  12. void Heapify(int a[], int i, int size) { /* 大根堆化 使以 i 为根的子树成为最大堆 */
  13.     int ls = 2*i, rs = 2*i+1;
  14.     int large;
  15.     if(ls <= size && a[ls] > a[i]) {
  16.         large = ls;
  17.     }
  18.     else large = i;
  19.     if(rs <= size && a[rs] > a[large]) {
  20.         large = rs;
  21.     }
  22.     if(large != i) {
  23.         swap(a[large], a[i]);
  24.         Heapify(a, large, size); // 子树原为大堆化 , 父辈树调整 -> 可能影响子树 -> 所以 : 子树重新调整(堆化)
  25.     }
  26. }
  27. void Build_Heap(int a[], int size) { // 建立堆树
  28.     for(int i = size/2; i >= 1; i--) {
  29.         Heapify(a, i, size);
  30.     }
  31. }

  32. void Heap_sort(int a[], int size) {
  33.      Build_Heap(a, size);
  34.      int len = size;
  35.      for(int i = len; i >= 2; i--) {
  36.         swap(a[i], a[1]);
  37.         len--;
  38.         Heapify(a, 1, len);
  39.      }
  40. }
  41. int main() {
  42.     int n, i;
  43.     scanf("%d", &n);
  44.     for(i = 1; i <= n; i++) {
  45.         scanf("%d", &a[i]);
  46.     }
  47.     Heap_sort(a, n);
  48.     for(i = 1; i <= n; i++) {
  49.         cout << a[i] << ' ';
  50.     }
  51.     cout << endl;
  52.     system("pause");
  53.     return 0;
  54. }

  55. /* 测试数据
  56. 7
  57. 8 5 4 9 2 3 6
  58. */

阅读(133) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~