[计算机软件及应用]第八章排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
27 38 [97 76 49 65 ] 27 38 49 [76 97 65 ]
27 38 49 65 [97 76 ] 27 38 49 65 76 [97 ] 27 38 49 65 76 97
8.3 选择排序
简单选择排序算法简单,但是速度较慢,时间复杂度 为O(n2),并且是一种不稳定的排序方法,在排序过程中 也只需要一个用来交换记录的暂存单元作为辅助空间。
8.2 插入排序
8.2.2 折半插入排序
折半插入排序是对直接插入排序的改进算法,它是 利用折半查找来实现插入位置的定位,可减少排序过程中 的比较次数。
适用于待排序的记录数量较大的情况。
8.2 插入排序
一趟折半插入排序的步骤为: (1)初始化 将待插入的记录存入r[0]中:r[0]←r[i]; 给指定查找区间上下界指针赋值:low←1,high ←i-1; (2)折半查找插入位置; (3)将插入位置后面的记录依次后移一个位置; (4)将暂存在r[0]中的待插入记录放入找到的位置上。
8.1 排序的基本概念
影响时间复杂性的主要因素又可以用算法执行中的 比较次数和移动次数来衡量。
在排序的过程中常需进行两种基本操作: ➢ 比较两个关键字的大小; ➢ 将记录从一个位置移动至另一个位置。
8.1 排序的基本概念
待排序的记录序列存储方式: ➢ 存放在地址连续的一组存储单元上,类似于线性表。排 序时必须移动记录; ➢ 存放在静态链表中,记录之间的次序关系由指针指定, 排序时不需要移动记录,仅需修改指针; ➢ 记录本身存储在一组地址连续的存储单元内,另设一个 指示各个记录存储位置的地址向量,排序时仅需移动地址向 量排序后再按照地址向量中的值调整记录的存储位置。
8.3 选择排序
选择排序(Selection Sort)的基本思 想是:每一趟从待排序的序列中选出关键字最 小的记录,顺序放在已排好序的子序列的最 后,直到全部记录排序完毕。 • 简单选择排序 • 堆排序
8.3 选择排序
8.3.1 简单选择排序
基本思想是:将整个序列(假设含有n条记录)分为有序区和无序区, 初始时有序区为空,无序区为整个待排序序列。
kk
k
i=1 初始: [ 4193 38 65 97 76 4139 27 ]
jjjjjj
k
k
i=2 一趟: 13 [3287 65 97 76 49 3287 ]
jjjjj 二趟: 13 27 [65 97 76 49 38 ]
三趟: 13 四趟: 13
五趟: 13 六趟: 13 排序结束: 13
8.3 选择排序
堆排序的基本思想是:对一组待排序的记录,首先把它 们按堆的定义排成一个堆,将堆顶元素取出;然后把剩下的 记录再排成堆,取出堆顶元素;依次下去,直到取出全部元 素,从而将全部记录排成一个有序序列。
8.3 选择排序
实现堆排序需要解决两个问题: (1)如何将一个无序序列建成一个堆? (2)如何在输出堆顶元素之后,调整剩余元素成为一 个新的堆?
•性别 •男 •男 •女 •女 •男 •女
8.1 排序的基本概念
排序过程中依据的不同原则,内部排序方法可大致 分为插入排序、交换排序、选择排序、归并排序和基数排 序等五类。
评价排序算法优劣的标准: 一是算法执行时所需的时间 二是执行算法时所需要的附加空间 执行排序的时间复杂性是算法优劣的重要的标志。
再从r[1]开始依次将记录插入到d[0]之前或之后的 有序序列中。
将数组d看成是一循环向量(既首尾相连的环状空间), 并设置两个指针first和final分别指向有序序列的第一条和最 后一条记录,将当前待插入记录r[i]与d[0]比较,若r[i] <d[0],则将其插入d[0]之前的有序序列中,反之,则 将其插入到d[0]之后的有序序列中。
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
无序序列 R[i+1..n]
8.2 插入排序
过程如下: 先将待排序记录序列中的第一个记录作为一个有序 序列,将记录序列中的第二个记录插入到上述有序序列中 形成由两个记录组成的有序序列,再将记录序列中的第三 个记录插入到这个有序序列中,形成由三个记录组成的有 序序列,如此进行下去,直到最后一个记录也插入完成。
直接插入排序是稳定的。
注意:第二条记录和第八条记录的相对位置在排序后没有发生变化, 此排序算法是稳定的。
8.2 插入排序
• 直接插入排序算法简单、易实现,其算法的时间复杂 度是O(n2)。 • 从空间复杂度来看,只需要一个记录大小的辅助空间 用于暂存待插入的记录。 • 当待排序记录较少时,排序速度较快,反之,当待排 序的记录数量较大时,大量的比较和移动操作将使直接插 入排序算法的效率降低; • 另外,若当待排序的数据元素基本有序时,排序过程 中的记录移动次数会大大减少,从而效率会有所提高。 • 直接插入排序是一种稳定的排序方法。
第1趟排序,从无序区的n个记录中选取最小的记录与序列中的第一 条记录交换位置,它做为有序区的第一条记录,此时无序区剩下n-1条记 录;
第2趟排序,从无序区的n-1条记录中选取最小的记录与序列中的第 二条记录交换位置,它做为有序区的第二条记录,此时无序区剩下n-2条 记录……
第i趟排序,从无序区的n-i+1条记录中选取最小的记录与序列中的 第i条记录交换,它做为有序区的第i条记录,此时无序区剩下n-i条记录;
建堆就是把待排序的记录序列{R1,R2,…,Rn},按 照堆的定义调整为堆,使父结点的关键字大于(或小于)子 结点的关键字。为此,我们先把待排序数据初始次序置入完 全二叉树的各个结点中,然后由下而上逐层进行父子结点的 关键字比较并交换,直到使其最后满足堆的条件。
当所有的记录都插入完成后,从指针first所指向的记录 开始一直读取到指针final所指向的记录,所得到的序列就是 排序后的有序序列。
8.2 插入排序
8.2 插入排序
8.2.4 希尔排序
希尔排序方法又称为缩小增量排序(Diminishing Increment Sort),是对直接插入排序方法的改进。
排序:将一个数据元素(或记录)的任意序列, 重新排列成一个按关键字有序的序列。
•学号 •99001 •99002 •99003 •99004 •99005 •99006
8.1 排序的基本概念
学生档案表
•姓名 •王晓佳 •林一鹏 •谢宁 •张丽娟 •周涛 •李小燕
•年龄 •18 •19 •17 •18 •20 •16
8.3 选择排序
8.3.2 堆排序
堆排序(Heap Sort)是利用堆的特性进行排序。 堆的定义如下: n个元素的序列为{K1,K2,…,Kn}, 当且仅当满足下列关系时,称之为堆。 Ki≤K2i ,Ki≤K2i+1或Ki≥K2i ,Ki≥K2i+1(i=1,2,…,n/2) 若将与此序列对应的一维数组看成是一棵完全二叉树 按层次编号的顺序存储,则堆的含义表明,完全二叉树中所 有非终端结点的值均不小于(或不大于)其左、右孩子结点 的值。因此,堆顶元素的值必为序列中的最大值或最小值 (即大顶堆或小顶堆)。
例如:
插入 位置 i
L.r 14 36 49 52 80 58 61 23 97 75
low
再如:
mhloigwhm low high
插入
m
位置
L.r 14 36 49 52 58 61 80
i
23 97 75
low high lowhigh
high
mm
m
8.2 插入排序
• 折半插入排序只减少关键字间的比较次数,而记录 的移动次数不变。故折半插入排序的时间复杂度仍为 O(n2)。 • 从空间复杂度来看,折半插入排序只需要一个记录 大小的辅助空间用于暂存待插入的记录,这与直接插入 排序相同。 • 折半插入排序是一种稳定的排序方法。
✓ 直接插入排序 ✓ 折半插入排序 ✓ 2ˉ路插入排序 ✓ 希尔排序
8.2 插入排序
8.2.1 直接插入排序
直接插入排序(Straight Insertion Sort)是一种最 简单的排序方法。
基本操作:依次将记录序列中的每一个记录插入到有 序序列中,使有序序列的长度不断地扩大。
一趟直接插入排序的基本思想:
i=4
(97) (38 49 65 97) 76 13 27 49’
i=5
(76) (38 49 65 76 97) 13 27 49’
i=6
(13)ቤተ መጻሕፍቲ ባይዱ(13 38 49 65 76 97) 27 49’
i=7
(27) (13 27 38 49 65 76 97) 49’
i=8
(49) (13 27 38 49 49’ 65 76 97)
11 23 12 9 18 16 25 36 30 47 31 第二趟希尔排序,设增量 d = 3
9 18 12 11 23 16 25 31 30 47 36 第三趟希尔排序,设增量 d = 1
9 11 12 16 18 23 25 30 31 36 47
8.2 插入排序
希尔排序是一种不稳定的排序方法。 在待排序的记录数目较大的情况下,希尔排序方法 一般要比直接插入排序方法快。 其时间复杂度与所选取的增量序列有关,是所取增 量序列的函数,介于O(nlog2n)和O(n2)之间。增 量序列有多种取法,但应使增量序列中的值没有除1之 外的公因子,并且增量序列中的最后一个值必须为1。 从空间复杂度来看,与直接插入排序一样,希尔排 序也只需要一个记录大小的辅助空间,用于暂存当前待 插入的记录。
如此反复,n个记录的可经过n-1 趟简单选择排序得到有序结果。
假设排序过程中,待排记录序列的状态为:
有序序列R[1..i-1] 无序序列 R[i..n]
第i趟 简单选择排序
从中选出 关键字最小的记录
有序序列R[1..i] 无序序列 R[i+1..n]
k指示序列中最小 数的位置
j指示当前比较数 的位置
基本思想: 将整个待排序的记录序列划分成若干个子序列, 然后分别对每个子序列进行直接插入排序,这样可以减 少参与直接插入排序的数据量,如此反复,当经过几次 分组排序后,记录的排列已经基本有序,这个时候再对 所有的记录进行一次直接插入排序。
例如:
16 25 12 30 47 11 23 36 9 18 31 第一趟希尔排序,设增量 d =5
一共需要经过n-1趟就可以将初始序列的n个记录重 新排列成按关键字值大小排列的有序序列。
监视哨L.r[0]
[初始关键字]: (49) 38 65 97 76 13 27 49’
i=2
(38) (38 49) 65 97 76 13 27 49’
i=3
(65) (38 49 65) 97 76 13 27 49’
8.1 排序的基本概念
假设含有n个记录的序列为{R1,R2,…,Rn}其相 应的关键字序列为{K1,K2,…,Kn}一种排列P1, P2, …,Pn,使其相应的关键字满足如下非递减关系 (满足非递增关系时,将“≤”号改为“≥”号) {Kp1≤Kp2≤…≤Kpn}使n个记录的无序序列成为一个按关 键字有序的序列{Rp1 ,Rp2 ,…,Rpn}这样一种操作 过程称为排序。
8.1 排序的基本概念
若在排序期间具有相同键值的记录的相 对位置不变,则称此排序方法是稳定的,否 则称为不稳定的。
8.2 插入排序
插入排序(Insertion Sort)的基本思想:每次 将一个待排序的记录,按其关键字的大小插入到前 面已经排好序的有序序列中的适当位置上,直到全 部记录插入完成为止。
[计算机软件及应用]第八章排序
第8章 排 序
学习目的要求:
1. 掌握排序的概念和排序的种类。 2. 熟练掌握五类基本排序:插入排序、交换排序、选
择排序、归并排序和基数排序的算法思想、算法 实现和性能分析。
第8章 排 序
8.1 排序的基本概念 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序 8.6 基数排序 8.7 几种排序方法的比较
8.2 插入排序
8.2.3 2-路插入排序
2-路插入排序是对折半插入排序的改进算法,它是 利用增加辅助空间来减少排序过程中移动记录的次数, 即“以空间换时间”。
8.2 插入排序
具体做法是:建立一个和待排序序列r[n]同类型的数组 d[n]作为辅助空间。
先将r[0]的值赋给d[0],将d[0]看成是处于最后 有序序列中处于中间位置的记录,