三个较为高效的排序算法
以下三个排序算法平均时间复杂度均为 堆排序(Heap Sort) 不稳定排序,接下来引入几个概念: 堆 一个如此编号的完全二叉树(完全二叉树:对于树中任意一个非叶节点,它要么左右子节点都有,要么只有左子节点。) 对于每个节点,其左子节点编号为其2倍,右子节点为2倍加1。 最大堆 父节点存的数永远比左右子节点存的数都大,如图: 同理,最小堆即:父节点存的数永远比左右子节点存的数都小。 排序步骤 以最大堆为例,也就是降序排序。 首先要构建最大堆: 1.每读入一个数,每个数放置在堆的对应位置(就是它的数组下标)。 2.然而对于这个数,与其父节点比较,大于就交换,越界或交换不了就退出。(相当于把这个数一层层往上提,直到提不动或越界) 3.重复1、2步骤,直到所有数据读入。 其次要维护最大堆: 1.将根节点(a[1])存储的数输出。(因为它一定是整个堆中最大的) 2.将堆末(即a[n])的数移至根节点,同时n--。 3.维护最大堆:将根节点的数与子节点比较,若左右子节点中有比它大的,则与左右子节点中较大的交换,直到无法交换或越界。(相当于把这个数一层层往下拉,直到拉不动或越界) 4.重复1、2、3步骤,直到所有数输出。 代码如下 #include <stdio.h> #include <iostream> #include <algorithm> using namespace std;