JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序 (4)

第三,选择排序的时间复杂度是多少 ?
无论是正序还是逆序,选择排序都会遍历 n2 / 2 次来排序,所以,最佳、最差和平均的复杂度是一样的。
最佳情况:T(n) = O(n2)。
最差情况:T(n) = O(n2)。
平均情况:T(n) = O(n2)。

动画

6. 解答开篇

为什么插入排序比冒泡排序更受欢迎 ?

冒泡排序和插入排序的时间复杂度都是 O(n2),都是原地排序算法,为什么插入排序要比冒泡排序更受欢迎呢 ?

这里关乎到 逆序度、满有序度、有序度。

有序度:是数组中具有有序关系的元素对的个数。
有序元素对用数学表达式表示就是这样:

有序元素对:a[i] <= a[j], 如果 i < j。

满有序度:把完全有序的数组的有序度叫作 满有序度

逆序度:正好跟有序度相反(默认从小到大为有序)。

逆序元素对:a[i] > a[j], 如果 i < j。

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

同理,对于一个倒序排列的数组,比如 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中可能用得到的全部的排序算法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywdwd.html