• 堆--堆排序


    算法描述

    1. heapify 建立大顶堆

    2. 将堆顶与堆底交换(最大元素被交换到堆底),缩小并下潜调整堆

    3. 重复第二步直至堆里剩一个元素

    可以使用之前课堂例题的大顶堆(堆的初步认识-CSDN博客)来实现

    MaxHeap方法:

    1. /**
    2. * @BelongsProject: arithmetic
    3. * @BelongsPackage: com.hzp.algorithm.heap
    4. * @Author: ASUS
    5. * @CreateTime: 2023-10-02 10:41
    6. * @Description: TODO 大顶堆Plus_增加了堆化等方法
    7. * @Version: 1.0
    8. */
    9. public class MaxHeap {
    10. int[] array;
    11. int size;
    12. public MaxHeap(int capacity) {
    13. this.array = new int[capacity];
    14. }
    15. /**
    16. * 获取堆顶元素
    17. *
    18. * @return 堆顶元素
    19. */
    20. public int peek() {
    21. //注意:当传入的数组是null时,我们可以设置一个判断来抛个异常,在这里我们就不去判断,请有需要的自行
    22. return array[0];
    23. }
    24. /**
    25. * 删除堆顶元素
    26. *
    27. * @return 堆顶元素
    28. */
    29. public int poll() {
    30. //注意:当传入的数组是null,可以设置一个判断来抛个异常,在这里我们就不去判断,请有需要的自行
    31. if(isEmpty()){
    32. throw new IllegalArgumentException("数组有问题");
    33. }
    34. int top = array[0];
    35. swap(0, size - 1);
    36. size--;
    37. //从索引位置0开始下潜
    38. down(0);
    39. return top;
    40. }
    41. private boolean isEmpty(){
    42. if(size==0){
    43. return true;
    44. }
    45. return false;
    46. }
    47. /**
    48. * 删除指定索引处元素 这个方法与删除堆顶元素方法思路一样
    49. *
    50. * @param index 索引
    51. * @return 被删除元素
    52. */
    53. public int poll(int index) {
    54. //注意:当传入的数组是null,可以设置一个判断来抛个异常,在这里我们就不去判断,请有需要的自行
    55. if(isEmpty()){
    56. throw new IllegalArgumentException("数组有问题");
    57. }
    58. int deleted = array[index];
    59. swap(index, size - 1);
    60. size--;
    61. down(index);
    62. return deleted;
    63. }
    64. /**
    65. * 替换堆顶元素
    66. * @param replaced 新元素
    67. */
    68. public void replace(int replaced) {
    69. array[0] = replaced;
    70. down(0);
    71. }
    72. /**
    73. * 堆的尾部添加元素
    74. *
    75. * @param offered 新元素
    76. * @return 是否添加成功
    77. */
    78. public boolean offer(int offered) {
    79. if (size == array.length) {
    80. return false;
    81. }
    82. up(offered);
    83. size++;
    84. return true;
    85. }
    86. //向堆的尾部添加元素: 将 offered 元素上浮: 直至 offered 小于父元素或到堆顶
    87. private void up(int offered) {
    88. int child = size;
    89. while (child > 0) {
    90. int parent = (child - 1) / 2;
    91. if (offered > array[parent]) {
    92. array[child] = array[parent];
    93. } else {
    94. break;
    95. }
    96. child = parent;
    97. }
    98. array[child] = offered;
    99. }
    100. public MaxHeap(int[] array) {
    101. this.array = array;
    102. this.size = array.length;
    103. heapify();
    104. }
    105. // 建堆
    106. private void heapify() {
    107. // 如何找到最后这个非叶子节点 :套用公式 size / 2 - 1
    108. for (int i = size / 2 - 1; i >= 0; i--) {
    109. down(i);
    110. }
    111. }
    112. // 将 parent 索引处的元素下潜: 与两个孩子较大者交换, 直至没孩子或孩子没它大
    113. private void down(int parent) {
    114. int left = parent * 2 + 1;
    115. int right = left + 1;
    116. int max = parent;
    117. //left < size:必须是有效的索引 不可能超出数组最大长度吧
    118. if (left < size && array[left] > array[max]) {
    119. max = left;
    120. }
    121. if (right < size && array[right] > array[max]) {
    122. max = right;
    123. }
    124. if (max != parent) { // 找到了更大的孩子
    125. swap(max, parent);
    126. down(max);
    127. }
    128. }
    129. // 交换两个索引处的元素
    130. private void swap(int i, int j) {
    131. int t = array[i];
    132. array[i] = array[j];
    133. array[j] = t;
    134. }
    135. public static void main(String[] args) {
    136. // int[] array = {1, 2, 3, 4, 5, 6, 7};
    137. // MaxHeap maxHeap = new MaxHeap(array);
    138. // System.out.println(Arrays.toString(maxHeap.array));
    139. //TODO 利用堆来实现排序
    140. //1. heapify 建立大顶堆
    141. //2. 将堆顶与堆底交换(最大元素被交换到堆底),缩小并下潜调整堆
    142. //3. 重复第二步直至堆里剩一个元素
    143. int[] array = {1, 2, 3, 4, 5, 6, 7};
    144. //1. heapify 建立大顶堆
    145. MaxHeap maxHeap = new MaxHeap(array);
    146. System.out.println(Arrays.toString(maxHeap.array));
    147. //3. 重复第二步直至堆里剩一个元素
    148. while(maxHeap.size>1){
    149. //将堆顶与堆底交换(最大元素被交换到堆底),缩小并下潜调整堆
    150. maxHeap.swap(0, maxHeap.size-1);
    151. maxHeap.size--;
    152. maxHeap.down(0);
    153. }
    154. System.out.println(Arrays.toString(maxHeap.array));
    155. }
    156. }

     实现:

    1. int[] array = {1, 2, 3, 4, 5, 6, 7};
    2. MaxHeap maxHeap = new MaxHeap(array);
    3. System.out.println(Arrays.toString(maxHeap.array));
    4. while (maxHeap.size > 1) {
    5. maxHeap.swap(0, maxHeap.size - 1);
    6. maxHeap.size--;
    7. maxHeap.down(0);
    8. }
    9. System.out.println(Arrays.toString(maxHeap.array));

  • 相关阅读:
    1.绪论:数据结构 + 算法的特性 + 时间/空间复杂度
    SpringMVC的概念和使用以及bean加载控制
    adb shell 获取手机分辨率
    变量和变量命名规则
    【SpringMVC】重定向和转向详解
    Mybatis映射文件中动态sql语句
    思科模拟器常用命令
    MySQL快速安装(mysql8.0.30区别之前yum安装)
    Flir Blackfly S 工业相机:自动曝光配置及代码
    Vuex之三连环
  • 原文地址:https://blog.csdn.net/m0_60333804/article/details/133581719