一、排序算法分类
所谓排序,是整理表中的记录,使之按关键字递增(或递减)有序排列,排序数据中可以存在相同关键字的记录。本文仅考虑递增排序。
常见有以下几种内排序算法:
二、排序算法分析
(可以点对应排序名链接进入查看详细分析)
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
直接插入排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 |
折半插入排序 | O(n2) | O(n2) | O(nlog2n) | O(1) | 稳定 |
希尔排序 | O(n1.3) | O(1) | 不稳定 | ||
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(nlog2n) | 不稳定 |
简单选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O( r ) | 稳定 |
三、备注
- 什么是时间复杂度和空间复杂度?参考我的另一篇文章
- 什么叫内排序?
在排序过程中,若整个表都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内排序;反之,若排序过程中要进行数据的内、外存交换,则称之为外排序。
- 什么是排序算法的稳定性?
如果待排序的表中,存在有多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则称这种排序方法是稳定的。
反之,若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。 - 排序算法稳定性的意义?
举一个实际的例子:要给电商的订单排序,订单有两个属性,一个是下单时间,一个是订单金额。
要求:对订单根据金额从小到大排序,金额相同的话按照下单时间再排序。
那我们的做法可能先根据金额排序,之后对于每个金额相同的小区间按照下单时间排队,这种思路简单,但是实现稍显复杂
借助稳定排序算法,我们可以先按照订单时间排序,之后再用稳定爱旭按照金额排序。稳定排序算法可以保证金额相同的两个对象再排序后的前后顺序不变。
稳定性的优点就体现出来了。