1. 数据结构和算法(十三)排序算法

1.1 排序算法

  所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。

1.2 排序算法分类

  • 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。
  • 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。

1.3 常见的排序算法分类

1.4 算法的时间与空间复杂度

主要还是从算法所占用的「时间」和「空间」两个维度去考量。

  • 时间频率

    • 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为时间频度。记为T(n)。
  • 时间复杂度

    • 在时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

    • T(n) 不同,但时间复杂度可能相同。 如:T(n)=n²+7n+6 与 T(n)=3n²+2n+2 它们的T(n) 不同,但时间复杂度相同,都为O(n²)。

    • 计算时间复杂度的方法:
      用常数1代替运行时间中的所有加法常数  T(n)=n²+7n+6 => T(n)=n²+7n+1修改后的运行次数函数中,只保留最高阶项  T(n)=n²+7n+1 => T(n) = n² 去除最高阶项的系数 T(n) = n² => T(n) = n² => O(n²)

1.5 常见的时间复杂度

  • 常见的时间复杂度

      常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n) ,随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低
    从图中可见,我们应该尽可能避免使用指数阶的算法。

  • 常数阶O(1)

    • 无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1).
    int i = 1
    int j = 2;i = i + j - i;
    j = i + j - j;
    
  • 对数阶O(log2n)

    • 在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2n) 。
        int i =1;while(i < n){i = i * 2;}
    
  • 线性阶O(n)

    • for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度
        for(int i = 1; i <= number; i++){j = i * 2;}
    
  • 线性对数阶O(nlogN)

    • 将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)
        for(int i = 1; i <= number; i++){while(i < number){i = i * 2;}}
    
  • 平方阶O(n²)

    • 如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即  O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)
        for (i=1;i<n;i++){for (j=0;j<=n;j++){j = i;j++;}}
    
  • 立方阶O(n³)、K次方阶O(n^k)

    • O(n³)相当于三层n循环。K次方阶相当于k层n循环。

1.6 平均时间复杂度和最坏时间复杂度

  • 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
  • 最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。
  • 平均时间复杂度和最坏时间复杂度是否一致
排序法 平均时间 最差情形 稳定度 额外空间 备注
冒泡 O(n2) O(n2) 稳定 O(1) n小时较好
交换 O(n2) O(n2) 不稳定 O(1) n小时较好
选择 O(n2) O(n2) 不稳定 O(1) n小时较好
插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较好
基数 O(logRB) O(logRB) 稳定 O(n) B是真数(0-9),R是基数(个十百)
希尔 O(nlogin) O(ns)1<s<2 不稳定 O(1) s是所选分组
快速 O(nlogin) O(n2) 不稳定 O(nlogin) n大时较好
归并 O(nlogin) O(nlogin) 稳定 O(1) n大时较好
O(nlogin) O(nlogin) 不稳定 O(1) n大时较好

    – 以上为《数据结构和算法(十三)排序算法》,如有不当之处请指出,我后续逐步完善更正,大家共同提高。谢谢大家对我的关注。

——厚积薄发(yuanxw)

数据结构和算法(十三)排序算法相关推荐

  1. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. 数据结构与算法(三) 排序算法(代码示例)

    数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...

  4. 数据结构与算法之排序算法

    数据结构与算法之排序算法 排序算法的介绍 ​ 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...

  5. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  6. python结构排序_Python数据结构(七)排序算法 上

    Python数据结构(七)排序算法 上 上回: 本文的重点不是代码,而是带着大家分析每一个排序算法背后的思想以及使用到的数据结构.很多时候不是我们想不出算法该如何去写,而是题目并没有指定特定的数据结构 ...

  7. 查找算法与排序算法之Python实现

    查找算法与排序算法 查找算法 顺序查找 二分查找 排序算法 冒泡排序 选择排序 简单选择排序 选择排序 插入排序 快速排序 堆排序 堆排序topk问题 归并排序 希尔排序 计数排序 桶排序 基数排序 ...

  8. 算法---比较排序算法

    在大批量的刷题之前,做好前期的准备工作,首先明白了时间复杂度和空间复杂度的计算方法,这个在我的上一篇博文里有提到,然后对经典排序算法做一个全面了解,2017.7.13,本文大部分内容引自http:// ...

  9. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  10. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...

    归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...

最新文章

  1. 基础篇:7.Content provider与Content Resolver实现数据共享
  2. 一台mysql并发能力_mysql怎么支撑百万级并发-对于同一个表,MySQL支持多少个并发操作...
  3. python100个必背知识-python必背内容有哪些
  4. ES关于文档的基本操作
  5. android okhttpclient设置编码,Android之okhttp实现socket通讯(非原创)
  6. 应用netstat查看目标机TCP连接的状况
  7. Swift之UITextField+富文本+代理传值
  8. IOS的四种数据存储方式及优劣
  9. 陶哲轩实分析 定理 13.4.6
  10. 医院设备管理系统方案/案列/软件/APP/小程序/网站
  11. 软件研发中也有5S 管理?
  12. ttest求pvalue_.net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
  13. Bit blit----From Wikipedia
  14. Part1---3.数据库编程与完整性
  15. 图片验证码有时会出现无法显示的问题
  16. Appium Android Bootstrap源码分析之简介
  17. PHP实现谷歌验证器二次验证
  18. win7临时文件_Win7系统电脑当中的temp文件是如何清理的?
  19. elementUI中el-radio-group的使用
  20. DRMsoft.cn未注册版 解决办法

热门文章

  1. db9针232接口波特率标准_9针RS232-422-485接口定义
  2. DLL注入之修改PE静态注入
  3. Mac 链接达梦数据库 DmJdbcDriver18.jar下载
  4. 在Visual Studio中使用Visual Basic教程:创建一个控制台应用
  5. 用Unity写设计模式-外观模式
  6. 关闭windows开机浏览器自动跳转MSN
  7. 荣耀手机wifi信号如何连接服务器,荣耀路由器怎么设置方法_荣耀路由器用手机怎么设置-WIFI之家...
  8. java学习——JavaScript入门
  9. 基于java SSM的房屋租赁系统设计和实现
  10. 《HBase权威指南》学习总结