排序——堆排序(Heap Sortd)

一时失言乱红尘 2022-08-20 11:25 75阅读 0赞

堆排序:是指利用堆这种数据结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素,堆分为大根堆和小根堆,是完全二叉树。

大根堆:每个节点上的值都不大于它父节点的值

小根堆:每个节点上的值都不小于它父节点的值

完全二叉树:除最后一层外每一层上的节点数都达到最大值,在最后一层上只缺少最右边若干个节点。

实例:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. //堆调整
  5. template<class T>
  6. void HeapAdjust(T data[], int i, int arrsize)
  7. {
  8. if (i > arrsize / 2) //i为叶子节点
  9. return;
  10. int lchiled = i * 2; //左叶子节点
  11. int rchiled = i * 2 + 1; //右叶子节点
  12. int max = i;
  13. if (lchiled <= arrsize && data[lchiled] > data[max])
  14. {
  15. max = lchiled;
  16. }
  17. if (rchiled <= arrsize && data[rchiled] > data[max])
  18. {
  19. max = rchiled;
  20. }
  21. if (max != i)
  22. {
  23. swap(data[i], data[max]);
  24. HeapAdjust(data, max, arrsize);
  25. }
  26. }
  27. //创建堆
  28. template<class T>
  29. void BuiledHeap(T data[], int arrsize)
  30. {
  31. for (int i = arrsize / 2; i >= 1; i--)
  32. {
  33. HeapAdjust(data, i, arrsize);
  34. }
  35. }
  36. //堆排序
  37. template<class T>
  38. void HeapSort(T data[], int arrsiz)
  39. {
  40. if (arrsiz < 2)
  41. return;
  42. BuiledHeap(data, arrsiz);
  43. swap(data[1], data[arrsiz]);
  44. for (int i = arrsiz - 1; i > 1; i--)
  45. {
  46. HeapAdjust(data, 1, i);
  47. swap(data[1], data[i]);
  48. }
  49. }
  50. template<class T>
  51. void Sprint(T data[], int n)
  52. {
  53. for (int i = 0; i < n; i++)
  54. {
  55. cout << data[i + 1] << " ";
  56. }
  57. cout << endl;
  58. }
  59. int _tmain(int argc, _TCHAR* argv[])
  60. {
  61. int data[] = { 0, 3, 5, 1, 4, 6, 2 };
  62. int n = sizeof(data) / sizeof(int) -1; //数组从1开始
  63. HeapSort(data, n);
  64. Sprint(data, n);
  65. return 0;
  66. }

发表评论

表情:
评论列表 (有 0 条评论,75人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序-排序

    1.堆排序前言 前面博客中讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知

    相关 排序-排序

    [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 在说明堆排序的过程前得先了解什么是堆: 先看下图(来源