第三,选择排序的时间复杂度是多少 ?
无论是正序还是逆序,选择排序都会遍历 n2 / 2 次来排序,所以,最佳、最差和平均的复杂度是一样的。
最佳情况:T(n) = O(n2)。
最差情况:T(n) = O(n2)。
平均情况:T(n) = O(n2)。
动画
6. 解答开篇为什么插入排序比冒泡排序更受欢迎 ?
冒泡排序和插入排序的时间复杂度都是 O(n2),都是原地排序算法,为什么插入排序要比冒泡排序更受欢迎呢 ?
这里关乎到 逆序度、满有序度、有序度。
有序度:是数组中具有有序关系的元素对的个数。
有序元素对用数学表达式表示就是这样:
满有序度:把完全有序的数组的有序度叫作 满有序度。
逆序度:正好跟有序度相反(默认从小到大为有序)。
逆序元素对:a[i] > a[j], 如果 i < j。同理,对于一个倒序排列的数组,比如 6,5,4,3,2,1,有序度是 0;
对于一个完全有序的数组,比如 1,2,3,4,5,6,有序度就是 **n*(n-1)/2** ,也就是满有序度为 15。
原因
冒泡排序不管怎么优化,元素交换的次数是一个固定值,是原始数据的逆序度。
插入排序是同样的,不管怎么优化,元素移动的次数也等于原始数据的逆序度。
但是,冒泡排序的数据交换要比插入排序的数据移动要复杂,冒泡排序需要 3 个赋值操作,而插入排序只需要 1 个,数据量一旦大了,这差别就非常明显了。
7. 复杂性对比复杂性对比
名称 平均 最好 最坏 空间 稳定性 排序方式冒泡排序 O(n2) O(n) O(n2) O(1) Yes In-place
插入排序 O(n2) O(n) O(n2) O(1) Yes In-place
选择排序 O(n2) O(n2) O(n2) O(1) No In-place
算法可视化工具
这里推荐一个算法可视化工具。
算法可视化工具 algorithm-visualizer 是一个交互式的在线平台,可以从代码中可视化算法,还可以看到代码执行的过程。
效果如下图。
8. 最后喜欢就点个小星星吧。
文中所有的代码及测试事例都已经放到我的 GitHub 上了。
参考文章:
数据结构与算法之美
十大经典排序算法总结(JavaScript描述)
JS中可能用得到的全部的排序算法