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


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 12 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python实现k-means聚类算法
Feb 23 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
python3人脸识别的两种方法
Apr 25 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
Python多分支if语句的使用
Sep 03 Python
python 下载文件的多种方法汇总
Nov 17 Python
Django celery异步任务实现代码示例
Nov 26 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数学运算
2011/12/30 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
ThinkPHP安装和设置
2015/07/27 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
判断网页编码的方法python版
2016/08/12 Python
python使用folium库绘制地图点击框
2018/09/21 Python
python实现简易数码时钟
2021/02/19 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
学python最电脑配置有要求么
2020/07/05 Python
python speech模块的使用方法
2020/09/09 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
优秀电子工程系毕业生求职信
2014/05/24 职场文书
创优争先心得体会
2014/09/11 职场文书
公司给客户的感谢信
2015/01/23 职场文书
党校毕业个人总结
2015/02/28 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python