数据结构--堆排序

目录

堆的定义 

建立初始化堆的步骤

建立大根堆的代码

大根堆排序的代码 

算法效率分析 

稳定性


堆的定义 

数据结构--堆排序_第1张图片

回忆

数据结构--堆排序_第2张图片

数据结构--堆排序_第3张图片

数据结构--堆排序_第4张图片

基于选择排序的特性:选取关键字最小(或者最大)的元素放入到序列里面,知道了大堆和小堆概念,所以将数组转换为二叉树用大小堆,进行选择排序比较方便

数据结构--堆排序_第5张图片

建立初始化堆的步骤

下面讲解给了初始序列(数组形式)如何转换为大根堆的样子来进行选择排序

非终端结点就是i<=n/2,即8/2=4,数组下标是01234的,后面的5678下标都是叶子结点不用管

数据结构--堆排序_第6张图片

调整后的样子如下

数据结构--堆排序_第7张图片

建立大根堆的代码

数据结构--堆排序_第8张图片

数据结构--堆排序_第9张图片

得到

数据结构--堆排序_第10张图片

 数据结构--堆排序_第11张图片

09小元素下坠如下: (每次把最大的元素往上面放)09的左右子树当中右子树78最大,78上移

数据结构--堆排序_第12张图片

09还是小于左右子树,此时左子树65大于53,所以把65上移,09下坠到65的位置 得到如下:

完成了第一趟的处理,效果是把最大元素放到末尾,上面树成为大根堆的形式

数据结构--堆排序_第13张图片

第二趟

78和53交换

数据结构--堆排序_第14张图片

交换得到如下 78和87已经放到最后就暂时不用考虑了

数据结构--堆排序_第15张图片

53进行下坠,和65换位置得到如下: (78放到最后了不需要和53比较)

数据结构--堆排序_第16张图片

剩余元素成为了大根堆,如下所圈出来部分

数据结构--堆排序_第17张图片

第三趟

数据结构--堆排序_第18张图片

 得到

数据结构--堆排序_第19张图片

下坠:

 数据结构--堆排序_第20张图片

得到如下,所圈出来部分又是大根堆

数据结构--堆排序_第21张图片

依次类推,得到结果

数据结构--堆排序_第22张图片

大根堆排序的代码 

数据结构--堆排序_第23张图片

算法效率分析 

只需要记住建堆的过程,关键字对比次数不超过4n,建堆的时间复杂度=O(n)

数据结构--堆排序_第24张图片 数据结构--堆排序_第25张图片

稳定性

堆排序不稳定

数据结构--堆排序_第26张图片

你可能感兴趣的:(数据结构)