数据结构07排序

第十章内部排序

10.1 概述

排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。

 

排序前Ki=Kj,且Ki在前:

排序方法是稳定的,若排序后Ki在前;

排序方法是不稳定的,如排序后Kj在前。

 

分类:

内部排序:排序过程在内存中进行;

外部排序:待排序记录的数量很大,内存一次不能容纳全部记录,需要对外存进行访问。

 

内部排序每一种方法都有各自的优缺点,适合在不同的环境下使用。

 

按不同原则进行分类:

插入排序    直接插入排序  其他插入排序  希尔排序

交换排序    冒泡 快速排序

选择排序    简单选择排序  树形选择排序  堆排序

归并排序    

基数排序

 

按时间复杂度划分:

简单排序方法  n^2

先进排序方法  nlogn

基数排序方法  d*n

 

10.2 插入排序

10.2.1 直接插入排序

直接插入排序(Straight Insertion Sort)  n^2

基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增一的有序表。


哨兵在0号位置,值为待插入数据。

 

10.2.2 其他插入排序

当待排序记录的数量n很小时,插入排序是一种很好的排序方法。

插入排序的改进:从减少“比较”和“移动”这两种操作的次数出发。

1. 折半插入排序(Binary Insertion Sort)  n^2

由于插入排序的基本操作是在一个有序表中进行查找和插入,这个查找操作可利用折半查找来实现。

减少了比较次数,移动次数不变。  

2. 2-路插入排序

在折半插入的基础上再改进之,其目的是减少排序过程中移动记录的次数,但需要n个记录的辅助空间。

移动次数约为(n^2)/8

L.r[1]是最小或最大,则2-路插入排序就失去其优越性。

循环数组:+1 mod length    -1 plus length mod length

 


10.2.3 希尔排序  n^1.3  

希尔排序(Shell’s Sort)又称“缩小增量排序”(Diminishing Increment Sort

一种插入排序类方法,但在时间效率上较前述排序方法有较大的改进。

基本思想:

先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序

子序列的构成不是简单的“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。

 

由于在前几趟的插入排序中记录的关键字是和同一子序列中的前一个记录的关键字进行比较,因此关键字较小的记录不是一步一步地向前挪动,而是跳跃式地往前移,从而使得在最后一趟增量为1的插入排序时,序列已基本有序,只要作记录的少量比较和移动即可完成排序,因此希尔排序的时间复杂度较直接插入排序低。  

增量序列中的值只有公因子1,并且最后一个增量值必须等于1

 

10.3 快速排序

基于交换

起泡排序Bubble Sort

快速排序Quick Sort

基本思想:

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,已达到整个序列有序。

快速排序被认为是,在所有同数量级(nlogn)的排序方法中,其平均性能最好。

 

10.4 选择排序(Selection Sort

10.4.1 简单选择排序(Simple Selection Sort

10.4.2 树形选择排序(Tree Selection Sort

又称锦标赛排序(Tournament Sort

完全二叉树的层数

n个叶子结点的完全二叉树,叶子结点表示关键字,非叶子结点中的关键字等于左右孩子结点中较小的关键字,根结点为最小关键字。

将最小关键字置为“最大值”,然后从该叶子结点开始,和其兄弟结点进行比较,可选出次最小关键字。

依此类推。

缺点:辅助存储空间较多,和“最大值”进行多余比较。

 

 

10.4.3 堆排序(Heap Sort

只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。

堆:n个元素的序列{K1, K2, ..., Kn}当且仅当满足以下关系时,称之为堆。


若将和此序列对应的一维数组看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不小于其左右孩子结点的值(大顶堆)。由此,堆顶元素必为序列中n个元素的最大值。

 

若在输出堆顶的最大值后,使得剩余n-1个元素的序列又建成一个堆,则得到n个元素的次大值。如此反复执行,便能能得到一个有序序列,这个过程称之为堆排序。

 

问题一:如何在输出堆顶元素之后,调整剩余元素成为一个新堆?

输出堆顶元素后,以堆中最后一个元素代替之。

此时根结点的左右子树均为堆,则仅需自上而下进行调整即可。

称自堆顶至叶子的调整过程为筛选”。

问题二:如何由一个无序序列建成一个堆?

从一个无序序列建堆的过程就是一个反复“筛选”的过程。

若将此序列看成一个完全二叉树,则最后一个非终端结点是第个元素,由此“筛选”只需从第个元素开始。

 

堆排序方法对记录数较少的文件并不值得提倡,但对n较大的文件还是很有效的。

其运行时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。

 

堆排序在最坏的情况下,其时间复杂度也为nlogn。相对于快速排序来说,这是堆排序的最大优点。此外,堆排序仅需一个记录大小供交换用的辅助存储空间。

 

 

10.5 归并排序(Merging Sort

“归并”的含义是将两个或两个以上的有序表组成一个新的有序表。

实现归并排序需和待排记录等数量的辅助空间,其时间复杂度为nlogn。

递归形式的算法在形式上较简洁,但实用性很差。

与快速排序和堆排序相比,归并排序最大的特点是,它是一种稳定的排序算法。

但在一般情况下,很少使用二路归并排序法进行内部排序。

 

 

10.6 基数排序(Radix Sorting

基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。

最高位优先(Most Significant Digit firstMSD

最低位优先(Least Significant Digit firstLSD

链式基数排序

借助“分配”“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。

 

首先,以静态链表存储n个待排记录,并令表头指针指向第一个记录。

第一趟分配对最低位数的关键字进行,将链表中的记录分配至Radix个链队列中去,f[i] e[i]分别指向第i个队列的头指针和尾指针。

第一趟收集是将Radix个链队列串为一个链队列。

然后进行第二趟分配、第二趟收集、第三趟分配、第三趟收集、...




10.7 各种内部排序方法的比较

排序方法

平均时间

最坏情况

辅助存储

简单排序

n^2

n^2

1

快速排序

nlogn

n^2

logn

堆排序

nlogn

nlogn

1

归并排序

nlogn

nlogn

n

基数排序

d*n

d*n

rd

 

(1)从平均性能而言,快速排序最佳,其所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。

(2)n较大时,归并排序所需时间较堆排序少,但它所需的辅助存储变量最多。

(3)直接插入排序最简单,当基本有序或n值较小时,它是最佳的排序方法,因此常将其和其他排序方法,诸如快速排序、归并排序等结合在一起使用。

(4)基数排序适用于n很大,而关键字“位数”较小的序列。

(5)基数排序是稳定的内排方法。所有时间复杂度为O(n^2)的简单排序法也是稳定的。

快速排序、堆排序、希尔排序是不稳定的。

 

综上所述,没有哪一种排序方法是绝对最优的,在实际应用时根据不同情况适当选用,甚至可将多种方法结合起来使用。

  

“地址排序”:另设一个地址向量指示相应记录;同时在排序过程中不移动记录而移动地址向量中相应分量的内容。





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找,即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系,故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址:https://www.centos.org/,点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像,与DVD ISO镜像的差别有很多,这里只说两点 1.Minimal ISO类似于Windows的纯净…

[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项。 结构体用于表示记录,假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题作者学…

Scala01入门

第1章 可伸展的语言 Scala应用范围广,从编写脚本,到建立大型系统。 运行在标准Java平台上,与Java库无缝交互。 更能发挥力量的地方:建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务,如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

设计模式学习(三)——单例模式

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…

设计模式之六大原则

设计模式之设计原则 这软件设计过程中&#xff0c;有六大设计原则&#xff1a; 单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则由于软件开发过程中&#xff0c;根据业务不同等因素形成了各种复杂的而不可预料的需求&#xff0c;遵守原则&#xff0c;让项…

安装配置tengine

安装tengine 1、依赖gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel 2、解压tengine压缩包&#xff0c;并进入目录&#xff1b; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

请访问 开源中国下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下载源码&#xff0c;按照如下的运行使用 springboot 改造 jeesite&#xff0c;只保留最简单的系统配置 。 介绍 1、运行主类&#xff0c;…

解决idea 中web项目无法正常显示的问题

转载于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知识点

hdfs命令行 上传 hadoop fs -put 文件名 hdfs://主机名:9000/... 下载 hadoop fs -get hdfs://主机名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夹下有测试程序 提交MapReduce任务命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 扩展名 包含子文件夹 文件 到某个 文件夹

比如我在d:\fff下面有很多子文件夹&#xff0c;子文件夹里还有子文件夹&#xff0c;里面有些文件夹里有.ppm.bz2的后缀的文件&#xff0c;需要把他们找出来复制到d:\fff2里面&#xff0c;应该怎么用批处理写&#xff1f;最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在线视频常见加密方式及安全性透析

信息化时代&#xff0c;多媒体的应用日渐成为人们生活中不可或缺的部分&#xff0c;无论是获取最新资讯还是教育学习&#xff0c;视频都是直观高效的媒介之一。 基于互联网的快速传播&#xff0c;众多培训机构也逐渐将线下原创版权课程迁移到在线平台中&#xff0c;一方面可以更…