| 排序算法 | 思路简述 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 | 稳定性 | 数据敏感性 |
|---|---|---|---|---|---|---|---|
| 冒泡排序 | 每排序一次,将剩余数里面最大数冒到最上面(最上面的是顺序排好的),从第1个开始,最后一个位置不用参与外层循环 | O(n²) | O(n²) | O(n) | O(1) | 稳定 | 敏感 |
| 选择排序 | 每次找出最小的排到最后,最后一个不用参与循环 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 | 不敏感 |
| 插入排序 | 每排序一次,将i插入到已经排好序的部分合适位置(最下面的是顺序排好的),从第2个数开始,第一个不用排,不用参与外层循环 | O(n²) | O(n²) | O(n) | O(1) | 稳定 | 敏感 |
| 快速排序 | 快速排序的思想就是,选一个数作为基数(这里我选的是第一个数),大于这个基数的放到右边,小于这个基数的放到左边,等于这个基数的数可以放到左边或右边,一趟结束后,将基数放到中间分隔的位置,第二趟将数组从基数的位置分成两半,分割后的两个的数组继续重复以上步骤,选基数,将小数放在基数左边,将大数放到基数的右边,在分割数组,,,直到数组不能再分为止,排序结束。 | O(nlgn) | O(n²) | O(nlgn) | O(nlgn) | 不稳定 | 敏感 |
| 堆排序 | 构造大堆 小堆 | O(nlgn) | O(nlgn) | O(nlgn) | O(1) | 不稳定 | 不敏感 |
| 希尔排序 | 交叉指数递减 然后循环插入排序 | O(nlgn) | O(ns) | O(n) | O(1) | 不稳定 | 敏感 |
| 归并排序 | 先拆开,再两组大小确定的数组排序合并,有可能是不对称的情况 | O(nlgn) | O(nlgn) | O(nlgn) | O(n) | 稳定 | 不敏感 |
| 计数排序 | * 中间数组 通过数组下标来表示原始数组的值,来统计每个元素出现的次数,然后新建一个数组将 中间数组 出现了几次,我就打印几次 到新的数组;不受O(nlgn)下界约束 | O(n+k) | O(n+k) | O(n+k) | O(n+k) | 稳定 | |
| 基数排序 | 按照个位十位百位逐次排序 | O(N*M) | O(N*M) | O(N*M) | O(M) | 稳定 | 敏感(象整型、字符串这样能分解,若是浮点型那就不行了) |
| 桶排序 | 桶排序假设待排序的一组数均匀独立的分布在一个范围中,并将这一范围划分成几个子范围(桶)。然后基于某种映射函数f ,将待排序列的关键字 k 映射到第i个桶中 (即桶数组B 的下标i) ,那么该关键字k 就作为 B[i]中的元素 (每个桶B[i]都是一组大小为N/M 的序列 )。接着将各个桶中的数据有序的合并起来 : 对每个桶B[i] 中的所有元素进行比较排序 (可以使用快排)。然后依次枚举输出 B[0]….B[M] 中的全部内容即是一个有序序列。 | O(n+k) | O(n²) | O(n) | O(n+k) | 不稳定 | 敏感 |
十大排序算法总结
于 2022-02-15 17:43:43 首次发布
3420

被折叠的 条评论
为什么被折叠?



