基础排序算法四——堆排序

Posted 聊聊Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础排序算法四——堆排序相关的知识,希望对你有一定的参考价值。

视频:https://youtu.be/MtQL_ll5KhQ

堆(二叉堆)可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示(普通的一般的二叉树通常用链表作为基本容器表示),每一个结点对应数组中的一个元素。

堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了。

如下图,是一个堆和数组的相互关系
基础排序算法四——堆排序
二叉堆一般分为两种:最大堆和最小堆。

最大堆:

  • 最大堆中的最大元素值出现在根结点(堆顶)

  • 堆中每个父节点的元素值都大于等于其孩子结点(如果存在)

最小堆:

  • 最小堆中的最小元素值出现在根结点(堆顶)

  • 堆中每个父节点的元素值都小于等于其孩子结点(如果存在)

代码实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Arrays;
/**
* @author amosli
* @date 2018-06-14  19:45
*/
public class HeapSort {
   static int[] array = new int[]{16, 14, 10, 8, 7, 9, 3, 2, 4, 1};

   public static void main(String[] args) {
       sort();
       System.out.println(Arrays.toString(array));
   }

   static void sort() {
       int len = array.length - 1;
       int beginIndex = (len - 1) >> 1;//4
       for (int i = beginIndex; i >= 0; i--) {
           maxHeapify(i, len);
       }

       for (int i = len; i > 0; i--) {
           swap(0, i);
           maxHeapify(0, i - 1);
       }
   }

   private static void swap(int a, int b) {
       int temp = array[a];
       array[a] = array[b];
       array[b] = temp;
   }

   /**
    * 调整索引为 index 处的数据,使其符合堆的特性。
    *
    * @param index 需要堆化处理的数据的索引
    * @param len   未排序的堆(数组)的长度
    */
   private static void maxHeapify(int index, int len) { //0-8  1,14, 10, 8, 7, 9, 3, 2, 4
       // 左子节点索引
       int li = (index << 1) + 1;//1,3
       // 右子节点索引
       int ri = (index << 1) + 2;//2,4


       // 子节点值最大索引,默认左子节点
       int cMax = li;
       if (li > len) {
           return;
       }

       if (ri <= len && array[ri] > array[li]) {
           cMax = ri;
       }

       if (array[cMax] > array[index]) {
           swap(cMax, index);
           maxHeapify(cMax, len);
       }
   }

}


参考

  • http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/

  • https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F#Java




以上是关于基础排序算法四——堆排序的主要内容,如果未能解决你的问题,请参考以下文章

Java排序算法 - 堆排序的代码

7.2堆排序的代码分析(算法基础—排序算法)

基础算法六之堆排序

重温基础算法内部排序之堆排序法

重温基础算法内部排序之堆排序法

八大排序算法之四选择排序—堆排序(Heap Sort)