• 堆专题1 向下调整构建大顶堆


    题目:

    样例:

    输入
    1. 6
    2. 3 2 6 5 8 7
    输出
    8 5 7 3 2 6

    思路:

            堆,是一颗完全二叉树,树中每个节点的值都不小于(或不大于)其左右孩子结点的值。

    其中,

    父结点大于或者等于孩子结点的值,称为大顶堆

    父结点小于或者等于孩子结点的值,称为小顶堆

    由于堆,是一颗完全二叉树,所以,我们可以将该完全二叉树压缩成 一维数组进行存储。

    其中,第一个结点 存储于数组中的 1 号位,并且数组 i 号位 表示的结点的左孩子就是 2i 号位,而右孩子则是(2i + 1)号位。

    向下调整堆,就是从 顶部的 根节点 向下调整到 叶子结点。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. #define x first
    8. #define y second
    9. #define mk make_pair
    10. #define int long long
    11. #define NO puts("NO")
    12. #define YES puts("YES")
    13. #define umap unordered_map
    14. #define INF 0x3f3f3f3f
    15. #define All(x) (x).begin(),(x).end()
    16. #pragma GCC optimize(3,"Ofast","inline")
    17. #define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
    18. using namespace std;
    19. const int N = 2e6 + 10,M = 500;
    20. using PII = pair<int,int>;
    21. int n;
    22. umap<int,int>heap; // 可以用哈希表作为 heap ,即有效率,又可以根据题意的数组大小变化
    23. inline void downAdjust(int low,int high)
    24. {
    25. int i = low,j = i * 2; // i 为欲调整的结点,由于是父结点开始调整所以是 i = low , j 为 左孩子
    26. // j 没有到达叶子结点,就向下调整
    27. while(j <= high)
    28. {
    29. // 如果存在右孩子,并且右孩子比左孩子大,我们调整右孩子
    30. if(j + 1 <= high && heap[j + 1] > heap[j])
    31. {
    32. ++j;
    33. }
    34. // 如果孩子结点 比 父结点 大 就向上调整
    35. if(heap[j] > heap[i])
    36. {
    37. swap(heap[j] , heap[i]); // 交换结点数值
    38. i = j; // 交换调整结点下标
    39. j = i * 2; // 更新调整结点 的 孩子结点下标
    40. }else break;
    41. }
    42. }
    43. inline void solve()
    44. {
    45. cin >> n;
    46. // 输入原始堆位
    47. for(int i = 1;i <= n;++i) cin >> heap[i];
    48. // 这里 n / 2 是 保证每个结点都是以其为父结点的子树中的权值最大的结点 进行向下调整
    49. for(int i = n / 2;i;--i) downAdjust(i,n);
    50. // 输出 调整后的堆
    51. for(int i = 1;i <= n;++i)
    52. {
    53. if(i > 1) cout << ' ';
    54. cout << heap[i];
    55. }
    56. }
    57. signed main()
    58. {
    59. // freopen("a.txt", "r", stdin);
    60. ___G;
    61. int _t = 1;
    62. // cin >> _t;
    63. while (_t--)
    64. {
    65. solve();
    66. }
    67. return 0;
    68. }

    最后提交:

  • 相关阅读:
    node_exporter无法启动处理
    Linux驱动开发笔记
    django组件552
    ubuntu源码安装aria2
    截图小技巧yyds
    IMAU鸿蒙北向开发-2023年9月5日学习日志
    Nginx之防盗链及高可用解读
    1-乙基-3-甲基咪唑四氟硼酸盐1E-3MI-TFB|石墨烯/导电高分子/离子液体修饰的黄曲霉毒素B1(科研)
    前端点击切换样式/切换主题
    腾讯云智实习1,2,3面
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/133762934