码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构和算法-堆排序

时间:2019-12-09 12:02:27      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:数组   i++   时间复杂度   构建   lse   数据结构   最大   heap   max   

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)

 

数据结构和算法-堆排序

标签:数组   i++   时间复杂度   构建   lse   数据结构   最大   heap   max   

原文地址:https://www.cnblogs.com/zhang-feng/p/12010030.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!