备注 | 最好时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 | ||
插入排序 | 直接插入排序 | 将一个元素插入到另一有序的序列中 | 有序,只需要比较,O(n) | O(n2) | O(n2) | O(1) | 是 |
折半插入排序 | 有序的,顺序存储,比较的次数可以减少,但是插入的次数没有减少 | 一个元素折半查找是 O(log2n),所以比较时间复杂度是O(nlog2n);最终是O(n2) | |||||
希尔排序 | 缩小增量排序;刚开始是组内元素少,后来全局有序的情况下直接插入排序效率比较高;只适合顺序存储 | O(1) | 否 | ||||
交换排序 | 冒泡排序 | 每趟确定一个元素,如果该趟没有交换元素,结束 | 有序,只进行比较,O(n) | O(n2) | O(n2) | O(1) | 是 |
快速排序 |
pivot,每趟确定一个元素到最终位置 优化:1)pivot的选择头中尾,取这三个元素的平均值 2)规模较小时候,不再使用递归,而是用直接插入排序 |
O(nlog2n) | 有序或者逆序,O(n2) | 需要一个栈,平均是O(log2N) | 否 | ||
选择排序 | 简单选择排序 | 每次选择最小的那个 | O(n2) | O(n2) | O(n2) | O(1) | 否 |
堆排序 | 构造初始堆 | O(nlog2n) | O(1) | 否 | |||
归并排序 | 两两归并 | O(nlog2n) |
两个有序表合成一个有序表。 O(n),合并的过程中用了辅助数组 |
是 |