• 数据结构系列-堆排序


    🌈个人主页:羽晨同学

    💫个人格言:“成为自己未来的主人~”  

    昨天我们实现的堆的搭建,我们今天实现以下堆的排序,

    堆的排序的最大的优点就是提高的效率,减小了时间复杂度,在这个里面我们有一个向上调整堆,时间复杂度是N,还有一个向下调整算法,时间复杂度是N*logN

    下面是实现的代码:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include"code.4.22.Heap.h"
    3. void HPInit(HP* php)
    4. {
    5. assert(php);
    6. php->a = NULL;
    7. php->capacity = php->size = 0;
    8. }
    9. void HPInitArray(HP* php, HPDataType* a, int n)
    10. {
    11. assert(php);
    12. php->a = (HPDataType*)malloc(sizeof(HPDataType) * n);
    13. if (php->a == NULL)
    14. {
    15. perror("malloc fail");
    16. return;
    17. }
    18. memcpy(php->a, a, sizeof(HPDataType) * n);
    19. php->capacity = php->size = n;
    20. //向上调整 建堆o(N*logN)
    21. for (int i = 1; i < php->size; i++)
    22. {
    23. AdjustUp(php->a, i);
    24. }
    25. //向下调整,建堆o(N)
    26. for (int i = (php->size - 1 - 1) / 2; i >= 0; i--)
    27. {
    28. AdjustDown(php->a, php->size, i);
    29. }
    30. }
    31. void HPDestroy(HP* php)
    32. {
    33. assert(php);
    34. free(php->a);
    35. php->a = NULL;
    36. php->capacity = php->size = 0;
    37. }
    38. void Swap(HPDataType* px, HPDataType* py)
    39. {
    40. HPDataType tmp = *px;
    41. *px = *py;
    42. *py = tmp;
    43. }
    44. void AdjustUp(HPDataType* a, int child)
    45. {
    46. int parent = (child - 1) / 2;
    47. while (child > 0)
    48. {
    49. if (a[child] > a[parent])
    50. {
    51. Swap(&a[child], &a[parent]);
    52. child = parent;
    53. parent = (parent - 1) / 2;
    54. }
    55. else
    56. {
    57. break;
    58. }
    59. }
    60. }
    61. //插入后保证数据是堆
    62. void HPPush(HP*php, HPDataType x)
    63. {
    64. assert(php);
    65. if (php->capacity == php->size)
    66. {
    67. size_t newCapacity = php->capacity == 0 ? 4 : 2 * php->capacity;
    68. HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);
    69. if (tmp == NULL)
    70. {
    71. perror("realloc fail");
    72. return;
    73. }
    74. php->a = tmp;
    75. php->capacity = newCapacity;
    76. }
    77. php->a[php->size] = x;
    78. php->size++;
    79. AdjustUp(php->a, php->size - 1);
    80. }
    81. HPDataType HPTop(HP* php)
    82. {
    83. assert(php);
    84. return php->a[0];
    85. }
    86. void AdjustDown(HPDataType* a, int n, int parent)
    87. {
    88. int child = parent * 2 + 1;
    89. while (child < n)
    90. {
    91. if (child + 1 < n && a[child] < a[child + 1])
    92. {
    93. child++;
    94. }
    95. if (a[child] > a[parent])
    96. {
    97. Swap(&a[child], &a[parent]);
    98. parent = child;
    99. child = parent * 2 + 1;
    100. }
    101. else
    102. {
    103. break;
    104. }
    105. }
    106. }
    107. //删除堆顶的数据
    108. void HPPop(HP* php)
    109. {
    110. assert(php);
    111. assert(php->size > 0);
    112. Swap(&php->a[0], &php->a[php->size - 1]);
    113. php->size--;
    114. AdjustDown(php->a, php->size, 0);
    115. }
    116. bool HPEmpty(HP* php)
    117. {
    118. assert(php);
    119. return php->size == 0;
    120. }
    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. typedef int HPDataType;
    9. typedef struct Heap
    10. {
    11. HPDataType* a;
    12. int size;
    13. int capacity;
    14. }HP;
    15. void HPInit(HP* php);
    16. void HPInitArray(HP* php, HPDataType* a, int n);
    17. void HPDestroy(HP* php);
    18. //插入后保证数据是堆
    19. void HPPush(HP* php,HPDataType x);
    20. //删除堆顶的数据
    21. void HPPop(HP* php);
    22. bool HPEmpty(HP* php);
    23. void AdjustUp(HPDataType* a, int child);
    24. void AdjustDown(HPDataType* a, int n, int parent);
    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include"code.4.22.Heap.h"
    4. void HeapSort(int* a, int n)
    5. {
    6. //数组a直接建堆
    7. for (int i = (n - 1 - 1) / 2; i >= 0; i--)
    8. {
    9. AdjustDown(a, n, i);
    10. }
    11. int end = n - 1;
    12. while (end > 0)
    13. {
    14. Swap(&a[0], &a[end]);
    15. AdjustDown(a, end, 0);
    16. end--;
    17. }
    18. }
    19. int main()
    20. {
    21. int a[] = { 3,6,1,5,8,9,2,7,4,0 };
    22. HeapSort(a, sizeof(a) / sizeof(a[0]));
    23. return 0;
    24. }

     

     

     

     

  • 相关阅读:
    sklearn机器学习——day08
    NNI 自动调参使用。
    PHP:BidirectionalQueue双向队列算法(附完整源码)
    IDEA2022用maven创建的Servlet项目
    毕业前写了20万行代码,让我从成为同学眼里的面霸
    Django中如何让DRF的接口针对前后台返回不同的字段
    mybatis04
    基于tushare和mongo,玩转qlib自带的数据库
    人工智能对我们的生活影响有多大
    CIE A-level分数线已公布
  • 原文地址:https://blog.csdn.net/in_seattle/article/details/138094728