1.堆排序(以大顶堆为例)
(1).堆排序简介:
堆排序是一个时间复杂度为O(nlog2n)(初始化堆的次数n(几个排序的数字初始化堆几次) × 建堆的过程 log2n(找最大数字的过程))、空间复杂度为O(1)(排序过程并不需要新的空间来存储数据)以及非稳定(建堆的过程可能会改变两个相同数字的相对位置)的排序算法。
(2).堆排序对数据结构的要求:
堆排序在排序过程中必须维护一个完全二叉树.我们使用数组来模拟堆,并以下标的方式来构建父节点与子节点存在的物理关系。
(3).堆排序详解
①建立初始堆:从最后一个非叶子节点的父节点开始(计算方式:(数组的长度 - 1 / 2 )- 1),当前父节点与两个子节点进行大小比较,最大的节点应被交换到父节点位置,这一比较过程应从最后一个父节点到根节点,所以是自下而上的。
②构造顺序序列:把当前根节点的值和最后一个叶子节点进行交换,这时数组长度减一(叶子节点减一),因为已交换的数字已经排序过。交换过后的堆已不满足大顶堆,因为根节点的值已不是最大值,所以这时的比较操作是从根节点到最后一个父节点,这是一个自上而下的过程。这样的构造排序的过程应维持到仅仅只有最后一个根节点。
(4).堆排序代码(Java):
/**
* @author Cookie
* @Project: DataStructuresAndAlgorithms
* @Packa