-
《数据结构与算法之美》笔记 11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?
排序算法
章 节 |
排序算法 |
时间复杂度 |
是否基于比较 |
11 |
冒泡、插入、选择 |
O(n^2) |
是 |
12 |
快排、归并 |
O(nlogn) |
是 |
13 |
桶、计数、基数 |
O(n) |
否 |
如何分析一个排序算法?
- 最好情况、最坏情况、平均情况时间复杂度
针对排序算法,用概率论方法定量分析平均时间复杂度,涉及的数学推理和计算就会很复杂。可以使用“有序度”和“逆序度”进行分析。
有序度是数组中具有有序关系的元素对的个数。有序元素对用数学表达式表示就是这样:有序元素对:a[i]<=a[j],如果i<j.
2,4,3,1,5,6
这组数据的有序度为11,因其有序元素对为11个,分别是:(2,4) (2,3) (2,5) (2,6) (4,5) (4,6) (3,5) (3,6) (1,5) (1,6) (5,6)
对于一个倒序排列的数组,比如6,5,4,3,2,1
,有序度是0;对于一个完全有序的数组,比如1,2,3,4,5,6
,有序度就是n*(n-1)/2
,也就是15.我们把这种完全有序的数组的有序度叫做满有序度。
逆序度概念和有序度相反,是逆序元素对个数:逆序元素对:a[i]>a[j],如果i<j.
,逆序度=满有序度-有序度
以冒泡排序为例,分析平均时间复杂度。冒泡排序包含两个操作原子:比较和交换。每交换一次,有序度加1。不管算法怎么改进,交换次数总是确定,即为逆序度,也就是n*(n-1)/2-初始有序度。最好情况就是初始有序度为满有序度,也就是n(n-1)/2,不需要交换;最坏情况是初始有序度为0,需要交换n(n-1)/2次。取中间值n(n-1)/4,来表示初始有序度不是很高也不是很低的平均情况,亦即交换次数为n(n-1)/4,考虑到比较次数比交换多,而复杂度上限是O(n2),所以平均情况下时间复杂度为O(n2)。
- 时间复杂度的系数、常数、低阶
排序算法阶数相同的情况下,要通过被忽略的系数常数和低阶项
- 比较次数和交换(或移动)次数
基于比较的排序算法涉及两种操作,一种是比较大小,一种是元素交换或移动。所以在分析时,都要考虑进去。
- 排序算法的内存消耗
算法的内存消耗可以通过空间复杂度来衡量,排序算法也不例外。针对排序算法,还引入了原地排序(sorted in place)的概念。原地排序算法特指空间复杂度是O(1)的排序算法。
- 排序算法的稳定性
仅从以上执行效率和内存消耗两个方面来分析排序算法还不够,还需对其稳定性进行分析。所谓稳定性,指的是如果待排序的序列中存在值相等的元素,经过排序后,相等元素之间原有的先后顺序不变。
以网上商城订单系统为例,一开始订单默认按下单时间排序,当使用排序算法对金额排序后,遇到金额相同的订单当然是希望仍按下单时间排序。
-
相关阅读:
将ObservableCollection(Of T) 数据 绑定到 Canvas
StylusNodeJS下构建更富表现力/动态/健壮的CSS
string引用类型
c#之预处理器指令
c#继承与构造函数
c#构造函数
c#之扩展方法
c#之结构
继承与重写
dedict: 很有新意的图形化英汉字典
-
原文地址:https://www.cnblogs.com/1million/p/13539831.html
Copyright © 2020-2023
润新知