【超详细】八大排序算法的各项比较以及各自特点


Posted in Python onMarch 31, 2021

千万不要错过这篇,不然你就亏大发了。

八大排序,各显神通。

  • 前言
  • 一、排序的概念
  • 二、各算法特点
    • 1.直接选择排序
    • 2.堆排序
    • 3.直接插入排序
    • 4.希尔排序
    • 5.冒泡排序
    • 6.快速排序
    • 7.归并排序
    • 8.基数排序 
  • 总结

前言

排序是计算机程序设计中一个非常重要的操作,它将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列。在有序的序列中查找元素的效率很高,(例如,折半查找法的平均查找长度为log2(n+1)−1log2(n+1)−1),但是无序序列只能逐一查找,其平均查找长度为(n+1)/2(n+1)/2。又比如构建二叉排序树的过程,就是一个排序的过程,因此,如何进行排序,尤其是高效排序,是一个重要的课题。


提示:以下带大家了解一下各个排序

一、排序的概念

1.1排序的概念

  1. 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
  2. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。
  3. 内部排序:数据元素全部放在内存中的排序。
  4. 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1.2 常见的排序算法

【超详细】八大排序算法的各项比较以及各自特点

1.3 稳定性及其复杂度

【超详细】八大排序算法的各项比较以及各自特点

二、各算法特点(具体看后面博客实现)

1.选择排序---直接选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。

找出序列中的最小关键字,然后将这个元素与序列首端元素交换位置。例如,序列前i个元素已经有序,从第i+1到第n个元素中选择关键字最小的元素,假设第j个元素为最小元素,则交换第j个元素与第i+1个元素的位置。依次执行此操作,直到第n-1个元素也被确定。

 【超详细】八大排序算法的各项比较以及各自特点

直接选择排序的特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

2.选择排序---堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

堆的插入:

每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,然后将这个新数据插入到这个有序数据中,在这个过程中要进行比较。

  1. 排大堆,就是最小的放在最上面,也就是升序
  2. 排小堆,就是最大的放在最上面,也就是降序  (具体看后面博客)

【超详细】八大排序算法的各项比较以及各自特点

堆排序的特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
  5. 应用:寻找M个数中的前K个最小的数并保持有序

3. 插入排序---直接插入排序

插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

【超详细】八大排序算法的各项比较以及各自特点

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2.  时间复杂度:O(N^2)
  3.  空间复杂度:O(1),它是一种稳定的排序算法
  4.  稳定性:稳定

  4. 插入排序---希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达=1时,所有记录在统一组内排好序。

【超详细】八大排序算法的各项比较以及各自特点

适用场景

比较在希尔排序中是最主要的操作,而不是交换。用已知最好的步长序列的希尔排序比直接插入排序要快,甚至在小数组中比快速排序和堆排序还快,但在涉及大量数据时希尔排序还是不如快排;

适合小数组小数据。

希尔排序的特性总结:

  1.  希尔排序是对直接插入排序的优化。
  2.  当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3.  希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3—N^2)
  4.  稳定性:不稳定

5.交换排序---冒泡排序

比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动

【超详细】八大排序算法的各项比较以及各自特点

冒泡排序的特性总结:

  1.  冒泡排序是一种非常容易理解的排序
  2.  时间复杂度:O(N^2)
  3.  空间复杂度:O(1)
  4.  稳定性:稳定
  5. 缺点:慢,每次只能移动两个相邻的数据;

6.交换排序---快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

将区间按照基准值划分为左右两半部分的常见方式有:

  1. hoare版本
  2. 挖坑法
  3. 前后指针版本

【超详细】八大排序算法的各项比较以及各自特点

快速排序的特性总结:

  1.  快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2.  时间复杂度:O(N*logN)
  3.  空间复杂度:O(logN)
  4.  稳定性:不稳定
  5. 适用场景:在给大量数据排序的时候,快排的效率尤为明显
  6. 效率:此排序算法的效率在序列越乱的时候,效率越高。在数据有序时,会退化成冒泡排序;

7.    归并排序

基本思想:

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 

归并排序的特性总结:

  1.  归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2.  时间复杂度:O(N*logN)
  3.  空间复杂度:O(N)
  4.  稳定性:稳定 
  5. 适用场景:若n较大,并且要求排序稳定,则可以选择归并排序;

8.基数排序 

基数排序的思想是按照组成关键字的各个数位进行排序,它是分配排序的一种。假如关键字是十进制数字,那么令r=10,d是所有关键字中的最大位数(位数小于d的数字,在前方补0)。基数排序可以从最低有效位开始,也可以从最高有效位开始。
  基数排序的思想是:设立r个队列,编号分别为0,1,2,3…,r-1。首先按照最低有效位的值,将n个关键字放置到r个队列中,然后从小到大将元素收集起来,再按照次低位的值将元素放置到各个队列中,再进行收集,重复上述过程,直到收集完毕为止。


总结

【超详细】八大排序算法的各项比较以及各自特点

Python 相关文章推荐
Python 变量类型及命名规则介绍
Jun 08 Python
python中的__slots__使用示例
Feb 26 Python
python中字典(Dictionary)用法实例详解
May 30 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
对python使用http、https代理的实例讲解
May 07 Python
Tensorflow 实现修改张量特定元素的值方法
Jul 30 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
Python对excel文档的操作方法详解
Dec 10 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
Python析构函数__del__定义原理解析
Nov 20 Python
pandas 操作 Excel操作总结
Mar 31 #Python
字典算法实现及操作 --python(实用)
如何利用python和DOS获取wifi密码
python爬虫selenium模块详解
Mar 30 #Python
python将图片转为矢量图的方法步骤
Mar 30 #Python
一文搞懂如何实现Go 超时控制
golang中的空接口使用详解
Mar 30 #Python
You might like
PHP下10件你也许并不了解的事情
2008/09/11 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Python编程之string相关操作实例详解
2017/07/22 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
初二学习计划书范文
2014/04/27 职场文书
2014年体育部工作总结
2014/11/13 职场文书
业务员辞职信范文
2015/03/02 职场文书
员工规章制度范本
2015/08/07 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
Mysql中mvcc各场景理解应用
2022/08/05 MySQL