排序算法在我们日常生活中其实很常见,比如office全家桶里的表格工具,可以按照自定义的规则进行排序:如果表格是一张成绩单,我们可以按照分数排序;如果表格是一张人员名单,我们可以按照人名的读音顺序排序。今天,我们来简单介绍下排序的一些属性与常见的排序方法~

所谓排序算法,指的是对一列数字进行的一种操作,以满足特定的次序f(a_1) <= f(a_2) <= … <= f(a_n) 。排序算法在计算机科学领域应用十分广泛,一个良好的、对于本程序而言复杂度较低的排序算法,往往可以使程序运行事半功倍。

时间复杂度的概念:定性表示程序运行的时间,表示为O(x),x越大程序运行时间越长。

01

排序根据稳定性不同,可以分为稳定排序与不稳定排序。那么什么是排序的稳定性呢?简单来说,就是优先级一致的元素,在排序前与排序后的相对顺序是否发生改变。

举个例子,现在有一张成绩单,小明与李华两位同学的分数一致,在排序前,小明在李华的前面,如果是稳定排序,那么排好序后,小明一定还排在李华的前面,但如果是不稳定排序,小明与李华的相对位置则不确定。

02

排序根据方法不同,又可以分为比较类排序与非比较类排序。比较类排序,顾名思义,会按照一定规则,在待排序元素之间相互比较,最终完成排序;非比较类排序则通过其他操作,不需要通过元素间的比较就可以完成排序。

首先,我们先介绍一下【冒泡排序】,也是初学者最常用的排序算法,它是一种稳定的比较类排序。

原理如下:每次从最开始比较相邻的元素,不断将违反规则的元素调换顺序,最终比较到最后一个元素,这样执行一轮之后,最小/大的元素就被移动到了最后,第二轮依次继续进行比较,将第二小/大的元素移动到倒数第二位。如此经过数轮排序后,自然会将所有元素排好序。它的优点是原理简单、实现简单,缺点是速度较慢。

接下来,介绍一下【快速排序】,也是常见的排序算法之一,它是一种不稳定的比较类排序。

原理如下:对于每一轮排序,选择一个基准值,将小于基准值的元素放到基准值左侧,将大于基准值的元素放到基准值右侧,接下来分别对两侧的两堆元素重复执行上述操作,直到所有元素有序。它的优点是速度较快,缺点是新手不易实现。

接着介绍一下【插入排序】,想象你现在在打牌,洗牌码牌抓牌看牌。很多人习惯把牌排成有序的。在摸排的过程中,每次摸到一张都要把它插入到合适的位置。依次进行便得到了有序的序列,这也是插入排序的基本思想:一个迭代的过程。对于每一个数,找到它所在的位置并进行插入。

如上所述,insertionSort的时间复杂度为O(n^2),主要时间花在了查找与插入的过程。每一次所花费的时间为O(n),一共经过了n次。但是其空间复杂度很低,主要空间用于数据存储。

对于在线性存储空间中存储的数据,其插入与查找的时间复杂度至少为O(n),这是数组、Vector、List、链表等都无法解决的。但是对于一些更加高级的数据结构,数据在非线性存储空间中存储,例如二叉搜索树,其插入与查找的时间复杂度至少为O(log n)。插入排序的总时间复杂度可以大大优化为O(n log n),这对于提升程序运行速度是十分有利的。

最后,再来介绍一下【计数排序】,在特定情况下使用有奇效,它是一种稳定的非比较类排序。

原理如下:找到一个分界值key,进行操作使比key小的数值全部被放在key 的左边,比key大的数值全部放在key的右边。之后分别对左右两边进行同样的操作。key的值一般取数组中第一个元素的值。本质上讲,快速排序也是一种递归的过程。他的优点是速度很快,缺点是需要维护额外空间及使用场景受限。

上面介绍了几种常见的排序算法,其实在真正的生产环节中,各种编程语言基本都自带了一些排序方法,比如 C++ 语言中的 sort,内部使用的排序算法是快速排序、归并排序等各种排序方法的综合体,在一般情况下,效率已经足够高。在我们巩固好基础、对各类排序算法的内部原理及实现掌握了之后,就可以放心大胆的使用 sort 进行排序了。

开课吧:什么是排序算法相关推荐

  1. 实验四 查找和排序算法实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验四 查找和排序算法实现 一.实验目的: 1.各种排序算法 ...

  2. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  3. C++排序算法实现(更新中)

    比较排序法:如冒泡排序.简单选择排序.合并排序.快速排序.其最优的时间复杂度为O(nlogn). 其他排序法:如桶排序.基数排序等.时间复杂度可以达到O(n).但试用范围有要求. 桶排序:排序的数组元 ...

  4. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  5. 十大排序算法 导图总结

    以下为我们经常用到的十大典型排序算法导图,很多设计以及优化的思想值得去参考学习 因为代码较多,所以都添加到对应的实现注释中了,相关代码可以从Mind-mapping获取xmind源文件 参考文档: 基 ...

  6. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  7. C++拾取——使用stl标准库实现排序算法及评测

    今天看了一篇文章,讲各种语言的优势和劣势.其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义.这让它在专心研究算法的人中非常受欢迎.所以很多时候,语 ...

  8. 常用排序算法的C++实现

    排序是将一组"无序"的记录序列调整为"有序"的记录序列. 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在 ...

  9. python 排序算法 简书_Python---简析八大排序算法

    前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...

最新文章

  1. linux 添加banner,OpenWrt:Linux下生成banner
  2. 关于在Windows下AndroidStudio.使用React-Native开发android报错红屏“run react-native start”解决
  3. 获取文件夹下的文件名并存入txt中
  4. Java DOC 转换给 PDF 格式文档的代码
  5. 技术前沿:分布式缓存Redis Cluster在华泰证券的探索与实践
  6. c++指定在某一线程运行_深入理解Java虚拟机-运行时数据区
  7. 深入理解android 博客,深入理解Android中ViewGroup
  8. 苍井空宣布结婚了,寂寞男孩的心开始寂寞~
  9. 如何搭建ti功放的软件调试环境
  10. 西瓜书学习之绪论部分
  11. 摸鱼小组-冲刺日志(第二天)
  12. php收付同分账,php微信分账功能 —— app支付
  13. java项目----教务管理系统_基于Java的教务管理系统
  14. 厨电智能化趋势下,究竟什么才是真正的“用户思维”?
  15. 20051114: 未麻的小屋
  16. Matlab 界面设计简单入门(App Designer)
  17. Java P2298 Mzc和男家丁的游戏
  18. Php实现投票系统,php实现投票系统的示例代码分析
  19. JavaScript游戏之连连看连线算法实例
  20. 火箭少女101毕业,rocketgirls.fans粉丝站上线震撼饭圈

热门文章

  1. 站内搜索(ELK)之数据表字典类型字段的索引思路
  2. 进程和线程的定义、区别与联系
  3. SQL Server中Rowcount与@@Rowcount的用法 和set nocount on 也会更新@@Rowcount
  4. python3-day2(基本回顾)
  5. require.js 的简单运用 --兰
  6. Qt SizeHint()
  7. java rsa加密 加签_RSA加密解密与加签验签
  8. 达梦系统录音服务器是哪个,达梦服务器安装及使用教程
  9. 计算机ip配置不正确怎么办,电脑ip地址不对该怎么办
  10. ios 旋转屏幕试图切换_总结iOS App开发中控制屏幕旋转的几种方式