zoukankan      html  css  js  c++  java
  • 《数据结构与算法之美》笔记 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)的排序算法。
    • 排序算法的稳定性
      仅从以上执行效率和内存消耗两个方面来分析排序算法还不够,还需对其稳定性进行分析。所谓稳定性,指的是如果待排序的序列中存在值相等的元素,经过排序后,相等元素之间原有的先后顺序不变。
      以网上商城订单系统为例,一开始订单默认按下单时间排序,当使用排序算法对金额排序后,遇到金额相同的订单当然是希望仍按下单时间排序。
  • 相关阅读:
    jmeter压测学习42-逻辑控制器之交替控制器
    jmeter压测学习41-逻辑控制器之吞吐量控制器
    jmeter压测学习40-逻辑控制器之事务控制器
    jmeter压测学习39-获取post请求x-www-form-urlencoded格式的数据
    jmeter压测学习38-通过Jython调用Python脚本
    对微信小程序的生命周期进行扩展 – Typescript 篇
    在微信小程序开发中使用Typescript
    TCP长连接和短连接 Python代码
    jQuery Ajax编程
    Django 网页中文显示u开头的乱码
  • 原文地址:https://www.cnblogs.com/1million/p/13539831.html
Copyright © 2011-2022 走看看