数据结构和算法-堆排序

Posted zhang-feng

tags:

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

1 维护最大堆性质的过程(MAX-HEAPIFY)

输入数组A和一个下标i。假设以LEFT(i)和RIGHT(i)为根节点二叉树都是最大堆,但是A[i]可能小于左右孩子节点。这时需要通过该过程使得A[i]在最大堆中“逐级下降”,从而使得以下标i为根节点二叉树为最大堆。

伪代码 :

MAX-HEAPIFY(A , i)

  L = LEFT(i) = 2i ;

  R = RIGHT(i) = 2i+1;

  if(L <= A.heap-size and A[L] > A[i]) {

         largest = L;

  } else {

         largest = i;

  }

  if(R <= A.heap-size and A[R] > A[largest]) {

         largest = R;

  }

  if( largest != i )

        max = A[largest];

        A[largest]= A[i];

        A[i]  = max;

        MAX-HEAPIFY(A , largest)

2 构建一个最大堆过程(BUILD-MAX-HEAP)

利用过程(MAX-HEAPIFY)把一个大小为n = A.length 的数组 A[1,...,n] 转化为最大堆。根据树的结构特点,子数组A(↓(n/2),...,n)中的元素都是树的叶节点 。每个叶节点都可以看成只包含一个元素的堆。过程BUILD-MAX-HEAP对树中非叶节点都调用一次过程(MAX-HEAPIFY)

BUILD-MAX-HEAP(A)

 A.heap-size = A.length;

 for(i = ↓A.length/2; i >= 1; i--) {

      MAX-HEAPIFY(A , i) ;

 }

3 堆排序过程

利用BUILD-MAX-HEAP将输入数组A[1,...,n]建成最大堆。数组最大元素A[1],交换A[1]与A[n],再通过A.heap-size-1来去掉节点n,再调用MAX-HEAPIFY来维护最大堆。不断重复该过程,直到堆的大小到2

伪代码:

HEAPSORT(A)

     BUILD-MAX-HEAP(A)

     for(i = A.lenght; i >=2; i++) {

              max = A[1];

              A[1] = A[i];

              A[i] = max;

              A.heap-size =  A.heap-size -1;

              MAX-HEAPIFY(A , 1);

     }

堆排序的时间复杂度Θ(nlgn)

 

以上是关于数据结构和算法-堆排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构精要------直接选择和堆排序算法

挖掘算法中的数据结构:堆排序之 二叉堆(Heapify原地堆排序优化)

算法系列之--Javascript和Kotlin的堆排序算法(原)

数据结构与算法-堆排序

算法与数据结构:堆排序

Day577.堆排序 -数据结构和算法Java