如何分析一个“排序算法”?
-
为什么插入排序和冒泡排序时间复杂度都是O(n2),但是插入排序使用更多呢?
-
排序算法的分析和评价
-
排序算法的执行效率
-
1.最好情况、最坏情况、平均情况(在什么样的原始数据下)
- 为什么要区分不同情况
- 方便对比
- 在不同情况下,选择更适合场景的排序
-
2.时间复杂度的系数、常数 、低阶
- 对于排序集合数据较小的情况(10 个、100 个、1000 个),考虑系数等等
-
3.比较次数和交换(或移动)次数
- 排序中涉及大量 比较+交换+移动操作,考虑比较和交换次数
-
-
排序算法的内存消耗
- 原地排序:空间复杂度为O(1) 的排序算法
- 冒泡,插入,选择都是原地排序算法
-
排序算法的稳定性
-
如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变\
-
排序算法的时候需要注意
-
为什么要考虑算法的稳定性
- 在时间有序的情况下,排序金额,如果算法不稳定,则会导致时间无序
-
-
\
冒泡排序
-
核心思想:冒泡排序只会操作相邻的两个元素
-
实现原理\
- 每次冒泡比较相邻两个元素
- 不满足大小关系则交换
- 一次冒泡会将一个元素移动到应该在的位置,重复n次就完成了n个数据的排序工作(将最大|最小的元素排序到合适的位置上)
-
冒泡排序的优化:当没有元素移动后,即可停止冒泡排序
-
特性
- 冒泡排序是原地排序算法
- 当两个相同元素时不交换,保证稳定性
- 冒泡排序时间复杂度:最好情况时间复杂度是 O(n)(有flag的情况下) 最坏时间复杂度O(n2)(逆序)平均时间复杂度O(n2)
\
\
插入排序
-
核心思想:将一个数插入有序数组中,遍历数组找到合适位置即可
-
实现原理
-
将数组中的数据分为两个区间,已排序区间和未排序区间\
-
在未排序中的区间中选择一个元素,插入到有序区间中(找到插入点后,需要将后面的元素移动一位)
-
重复过程,直到未排序区间没有元素
-
-
基本操作:比较+移动
-
特点
-
是原地排序算法
-
是稳定排序算法
-
时间复杂度
- 最好是时间复杂度为 O(n) 只比较一次即可(比较最大元素)
- 最坏时间复杂度为 O(n2)
- 平均时间复杂度为 O(n2)\
-
\
选择排序
-
核心思想:分已排序区间和未排序区间,但是每次选择在未排序区间选择最小元素放入已排序区间的末尾
-
特点:
-
是原地排序算法
-
选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 O(n2)\
-
不是稳定的排序算法,swap过程中会打乱稳定性
-
-
优点不明显,缺点很明显
\
总结
-
冒泡和插入的交换次数都是固定的
-
操作:冒泡需要3个赋值操作,插入排序只需要1个 赋值操作更简单(时间更短)\
-
对于O(n2) 时间复杂度的排序适合小规模数据
\
\