《数据结构与算法之美》笔记 11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?

排序算法

章 节 排序算法 时间复杂度 是否基于比较
11 冒泡、插入、选择 O(n^2)
12 快排、归并 O(nlogn)
13 桶、计数、基数 O(n)

如何分析一个排序算法?

  • 排序算法的执行效率
  1. 最好情况、最坏情况、平均情况时间复杂度
    针对排序算法,用概率论方法定量分析平均时间复杂度,涉及的数学推理和计算就会很复杂。可以使用“有序度”和“逆序度”进行分析。
    有序度是数组中具有有序关系的元素对的个数。有序元素对用数学表达式表示就是这样:有序元素对: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)。
  2. 时间复杂度的系数、常数、低阶
    排序算法阶数相同的情况下,要通过被忽略的系数常数和低阶项
  3. 比较次数和交换(或移动)次数
    基于比较的排序算法涉及两种操作,一种是比较大小,一种是元素交换或移动。所以在分析时,都要考虑进去。
  • 排序算法的内存消耗
    算法的内存消耗可以通过空间复杂度来衡量,排序算法也不例外。针对排序算法,还引入了原地排序(sorted in place)的概念。原地排序算法特指空间复杂度是O(1)的排序算法。
  • 排序算法的稳定性
    仅从以上执行效率和内存消耗两个方面来分析排序算法还不够,还需对其稳定性进行分析。所谓稳定性,指的是如果待排序的序列中存在值相等的元素,经过排序后,相等元素之间原有的先后顺序不变。
    以网上商城订单系统为例,一开始订单默认按下单时间排序,当使用排序算法对金额排序后,遇到金额相同的订单当然是希望仍按下单时间排序。
posted @ 2020-08-21 10:48  飞吧小鸡  阅读(136)  评论(0编辑  收藏  举报