数据结构中内部排序的各种比较

2023-11-09

排序算法中的稳定和不稳定指的是什么?

若在待排序的纪录中,存在两个或两个以上的关键码值相等的纪录,经排序后这些记录的相对次序仍然保持不变,则称相应的排序方法是稳定的方法,否则是不稳定的方法。


 

内部排序和外部排序

根据排序过程中涉及的存储器不同,可以讲排序方法分为两大类:一类是内部排序,指的是待排序的几率存放在计算机随机存储器中进行的排序过程;另一类的外部排序,指的是排序中要对外存储器进行访问的排序过程。

内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序、交换排序、选择排序、归并排序和基数排序;

根据排序过程的时间复杂度来分,可以分为三类:

简单排序、先进排序、基数排序。

评价排序算法优劣的标准主要是两条:一是算法的运算量,这主要是通过记录的比较次数和移动次数来反应;另一个是执行算法所需要的附加存储单元的的多少。

 

  1. 冒泡排序(BubbleSort

    冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。 
  2. 插入排序(InsertSort

    插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。
  3.  Shell (希尔) 排序(ShellSort

    Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

    Shell排序比冒泡排序快5倍,比插入排序大致快2Shell排序比起QuickSort(快排),MergeSort(归并),HeapSort(堆排)慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。
  4.  快速排序(QuickSort

    快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

    1 如果不多于1个数据,直接返回。
    2 一般选择序列最左边的值作为支点数据。
    3 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
    4 对两边利用递归排序数列。

    快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 (一般都是牺牲空间换取时间)

     

5归并排序(MergeSort

归并排序先分解要排序的序列,从1分成22分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

/*

6 堆排序(HeapSort

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

7基数排序(RadixSort

是桶排序的优化升级

数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点 数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需 要较多的存储空间。
8交换排序(ExchangeSort)和选择排序(SelectSort
这两种排序方法都是交换方法的排序算法,效率都是 O(n2):这是非常恐怖的。在实际应用中处于和冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。

*/
 

9总结
下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。

排序法

 平均时间

最差情形

稳定度

额外空间

备注

冒泡

 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是基数(个十百)

Shell

O(nlogn)

O(ns) 1<2

不稳定

O(1)

s是所选分组

快速

O(nlogn)

O(n2)

不稳定

O(nlogn)

n大时较好

归并

O(nlogn)

O(nlogn)

稳定

O(1)

n大时较好

O(nlogn)

O(nlogn)

不稳

O(1)

n大时较好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构中内部排序的各种比较 的相关文章

随机推荐

  • IntelliJ IDEA Java开发环境配置(包含JDK和JRE安装的注意事项)

    1 JDK的安装以及环境变量的配置 官网下载 https www oracle com java technologies javase downloads html 安装流程请看下面的图解 注意事项 安装路径不要有中文 空格或者特殊符号
  • 加密:python crypto AES : Object type cannot be passed to C code

    在使用pcryptodome的时候 发现了一个错误 Python之AES加密 本人电脑上的加密库的版本和别人电脑上的版本不一样 我电脑加密内容需要是字节 修改了一下 修改之后如下 self key key 修改为 self key key
  • CMOS Sensor基础知识

    CMOS Sensor基础知识 曝光时间以行长为单位 PCLK以Hz为单位 行长以周期数为单位 帧长以行长数为单位 其中周期数就是频率 T 周期以ms为单位 f 频率以Hz为单位 f 1 T Vsync Dummy Line VTotal
  • Elasticsearch之中文分词器插件es-ik(博主推荐)

    前提 什么是倒排索引 Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasticsearch之几个重要的分词器 elas
  • CSS 3之鼠标特效

    鼠标特效 1 鼠标箭头 2 鼠标变换效果 1 鼠标箭头 使用 cursor 属性 鼠标指针属性 能实现对鼠标样式的控制 例子 1 h2 控制鼠标箭头 h2 div style font size 10px color darkblue p
  • SQL学习(四)条件查询(字符串类型属性筛选)

    本节主要使用WHERE语句筛选字符串类型的属性 概述 LIKE 模糊查询 和 通配符 是字符串相关查询的两个关键字 条件查询语句还是WHERE语句 SELECT column another column FROM mytable WHER
  • Ribbon自定义负载均衡策略

    负载均衡策略 负载均衡的规则都定义在IRule接口中 而IRule有很多不同的实现类 自定义负载均衡策略 2 通过定义IRule实现可以修改负载均衡规则 启动类里注入 Bean public IRule randomRule return
  • Linux系统之编译安装python3

    Linux系统之编译安装python3 一 python3介绍 1 python3简介 2 python3特点 二 检查本地环境 1 检查本地操作系统版本 2 检查内核版本 3 检查当前python版本 三 安装前准备工作 四 下载pyth
  • Linux - 进阶 NFS 服务器 NFS文件权限与共享目录权限主次问题

    原理 NFS 的权限本身没有用户密码和账户验证登录过程 你可以回忆下 我们前面访问远程共享目录的时候 是没有输入账户 密码啥的 是没 有这个步骤的 所以客户端登录到服务器后 会把客户端的账户身份映射到服务器端 NFS 要访问成功 不仅与服务
  • 数据结构学习系列之顺序表的两种修改方式

    方式1 根据顺序表中数据元素的位置进行修改 代码如下 示例代码 int modify seq list 1 list t seq list int pos int data if NULL seq list printf 入参为NULL n
  • @RequestBody必须post请求以上

    否则会报错 HttpMessageNotReadableException Required request body is missing
  • Flutter实现返回键两次退出app

    逻辑 比对两次返回时间 需要用到WillPopScope组件 捕捉返回事件 实现 return new WillPopScope child onWillPop async 点击返回键的操作 if lastPopTime null Date
  • 体外膜肺氧合(ECMO)

    目录 体外膜肺氧合 ECMO ECMO到底是什么 2022 2028年中国体外膜肺氧合系统 ECMO 行业市场发展现状及竞争格局预测报告 国产高性能ECMO 实现重大突破 首个国产ECMO 获证 ECMO膜肺膜材料 全国首例 国产ECMO在
  • 基于Gabor-小波滤波深度图表面法线的特征提取算法【通过正常Gabor-小波的直方图进行2D或3D特征提取】研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 通过一种新的五步算法彻底研究了鼻
  • 可能是颜值最高的微信Markdown编辑器,用Markdown的你一定会爱上

    不论是新媒体小编还是拥有自己公众号的开发者和开源组织 一定想要一个能够快速编辑且成品美观大方的编辑器 毕竟微信自带的编辑器功能有限 市面上其他编辑器功能又过于繁多 尤其对于开发者来说 文章中插入代码块这件事就非常令人头疼 所以 Gitee
  • 笔记--利用python下载bilibili视频

    目录 1 打开cmd终端 2 激活base环境 3 安装you get第三方库 已安装可以跳过 4 下载视频 5 实例 6 参考 1 打开cmd终端 进入保存下载视频的文件夹 cd C Users XXXXXX Desktop video
  • 刷OPENWRT后悔了,刷回原厂固件教程

    之前之所以要刷固件 是因为上网时经常将网页重定向到路由器的管理员界面 如果你也有这种问题 那么不用刷了 直接找售后换货或退货 这是路由器质量问题 刷机没法解决 原文 http www sjyyt com thread 334508 1 1
  • 移动通信中的信源编码和调制调节技术

    通信原理 移动通信中的信源编码和调制调节技术的思维导图 一个上课老师留的作业 这个不带图片 带图片的在我发的另一个 移动通信中的信源编码和调制调节技术 3 1 概述 调制就是对消息源信息进行编码的过程 其目的就是使携带信息的信号与信道特性相
  • 2023最全最新前端面试题(附加解析)

    JS 1 说一下innerHTML 与 innerText的作用与区别 作用 都可以获取或者设置元素的内容 区别 innerHTML可以解析内容中的html标签 innerText不能解析内容中的html标签2 JavaScript 由以下
  • 数据结构中内部排序的各种比较

    排序算法中的稳定和不稳定指的是什么 若在待排序的纪录中 存在两个或两个以上的关键码值相等的纪录 经排序后这些记录的相对次序仍然保持不变 则称相应的排序方法是稳定的方法 否则是不稳定的方法 内部排序和外部排序 根据排序过程中涉及的存储器不同