各类排序算法对比
时间复杂度来说:
- 平方阶(O(n2))排序
各类简单排序:直接插入、直接选择和冒泡排序; - 线性对数阶(O(nlog2n))排序
快速排序、堆排序和归并排序; - O(n1+§))排序,§是介于0和1之间的常数。
希尔排序 - 线性阶(O(n))排序
基数排序,此外还有桶、箱排序。
当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O(n);
而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O(n2);
原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。
堆排序
堆:一种特殊的完全二叉树结构
大根堆: 一棵完全二叉树,满足任一节点都比其孩子节点大
小根堆: 一棵完全二叉树,满足任一节点都比其孩子节点小
堆的向下排序:假设根节点的左右子树都是堆,但根节点不
满足堆的性质可以通过一次向下的调整来将其变成一个堆。
堆排序的过程:
1.建立堆
2.得到堆顶元素,为最大元素
3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。
4.堆顶元素为第二大元素。
5.重复步骤直到堆变空。
时间复杂度:O(nlogn)
归并排序
分解:将列表越分越小,直至分成一个元素。
终止条件: 一个元素是有序的。
合并:将两个有序列表归并,列表越来越大。
一次归并: O(n)
归并排序:nlogn
希尔排序
是一种分组插入排序算法。
首先取整数d=n/2,将元素分为d个组,每组相邻量元素之间距离为d,在各组内进行直接插入排序;
取第二个整数d1=d/2,重复上述分组排序过程,直到dn=1,即所有元素在同一组内进行直接插入排序。希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序,最后一趟排序使得所有数据有序。
计数排序
对列表进行排序,已知列表中的数范围都在0到100之间。复杂度为O(n).,是一种多关键字排序,先比较个位十位百位
桶排序
首先将元素分在不同的桶中,再对每个桶中的元素进行排序