常用排序算法比较
排序算法 | 简单描述(默认从小到大排序) | 时间复杂度(平均情况) | 适用场景 |
选择排序 | 找最小的元素,与第一个元素交换,再在剩下的元素中进行如上操作,直至排序完成。 | 交换次数为N,时间复杂度取决于比较次数。 O(N2) |
|
插入排序 | 从第一个元素开始,每次将下一个元素加入排序,直至排序完成。 | O(N2) | 部分有序的数组; 小规模数组。 |
希尔排序 | 基于插入排序; 使数组中任意间隔为h的元素都是有序的。 | 小于O(N2),大于O(NlgN) | 中等大小的数组,代码量小,不使用额外的内存空间; 解决排序问题又没有系统函数可以调用。 |
冒泡排序 | 从第一个元素开始,依次比较该元素和其下一个元素,如果该元素较大,则交换位置,再从第二个元素开始,如此这般,最后将最大的元素排到数组的最后一个元素,再在剩下的元素中进行如上操作,直至排序完成 | O(N2) |
|
并归排序 | 自顶向下:将一个数组一分为二,将这两个小数组分别排序,再将这两个小数组归并为排好序的数组。运用这种思想到每一个数组,直到数组大小为1。 | O(NlgN) |
|
自底向上:把每个元素看成一个小数组,先两两并归,再四四并归,最终将所有元素并归到同一个数组中。 | 用链表组织的数据。 | ||
快速排序 | 选定一个切分元素,将数组一分为二,当两部分都有序时,整个数组也就有序了 | O(NlgN) | 大量数据的数组 |
三向切分快速排序:将数组分成三部分,分别对应小于、等于和大于切分元素的数组元素(等于部分在中间),当小于和大于部分都有序时,整个数组也就有序了。 | 数组中有许多重复数据出现。 | ||
堆排序 | 将数组进行优先队列排序,将第一个元素(也就是优先队列中最大的元素)和数组的最后一个元素进行交换,优先队列长度减一,重复此操作,直到优先队列长度变为1。 | O(NlgN) | 最优利用时间和空间。 |
常见排序算法时间复杂度及稳定性比较
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 |
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn)~O(n) | 不稳定 |