选择类排序-堆排序

185 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

排序算法中可以大致分为以下几类

  1. 插入类排序:直接插入排序、折半插入排序、希尔排序
  2. 选择类排序:简单选择排序、堆排序
  3. 交换类排序:冒泡排序、快速排序

堆积排序

简介

堆积排序是另一种形式的排序排序方法,可以认为是对直接排序法的一种改进。堆积排序简称为堆排序

堆积的定义

具有n个数据元素的序列K=(k1,k2,k3,···,k4),当且仅当满足条件

image.png 时,称为序列k为一个堆积,简称。有时将满足条件a的堆积称为大顶堆积,满足条件b的堆积称为小顶堆积。大顶堆积中的第一个元素具有最大值。 堆积可以与一颗完全二叉树对应,而且很容易确定该完全二叉树中任意结点i的孩子结点位置。

堆积排序

以下以大顶堆为例子。

堆积过程

堆积排序的过程可以归纳为执行一下步骤。

  1. 建立初始堆积
  2. 交换堆积的第一个元素(最大值元素)与堆积的最后那个元素的位置
  3. 将移走最大元素之后的剩余元素组成的序列再转换为一个堆积
  4. 重复上述过程的第2步和第3步n-1次 堆积排序的关键是讲序列构造为堆积,包括如何讲原始序列构造为一个初始堆积,以及如何讲移走了最大值元素以后的剩余元素组成的序列再构造为一个新的堆积两部分。

构造堆积

下图是由9个元素构成的初始堆积,除了第一个元素 18 以外都满足大顶堆积。将元素18与两个根节点元素比较,与其中较大者交换位置。将根节点元素与有孩子交换位置后如图b所示。接着将18继续与它的左右孩子相比较,再与其中较大的孩子交换位置。将18与其左孩子交换位置如图10.5所示,就能得到一个调整好的堆积。 image.png

复杂度

复杂度为O(n*log n)。

稳定性

堆积排序方法属于一种不稳定排序方法。