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


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交换变量
Sep 06 Python
python的正则表达式re模块的常用方法
Mar 09 Python
Python迭代器和生成器介绍
Mar 06 Python
教大家玩转Python字符串处理的七种技巧
Mar 31 Python
Python 实现链表实例代码
Apr 07 Python
windows 下python+numpy安装实用教程
Dec 23 Python
浅析Python函数式编程
Oct 06 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 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英文字母大小写转换函数小结
2014/05/03 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
vue实现购物车小案例
2019/09/27 Javascript
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
tensorflow识别自己手写数字
2018/03/14 Python
对python sklearn one-hot编码详解
2018/07/10 Python
django框架ModelForm组件用法详解
2019/12/11 Python
python与mysql数据库交互的实现
2020/01/06 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
opencv python如何实现图像二值化
2020/02/03 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
当当网软件测试笔试题
2015/11/24 面试题
迟到早退检讨书
2014/02/10 职场文书
通信工程专业求职信
2014/06/04 职场文书
迎七一演讲稿
2014/09/12 职场文书
会计出纳岗位职责
2015/03/31 职场文书
详解在OpenCV中如何使用图像像素
2022/03/03 Python