第10章 内排序
数据结构-内排序
Shell排序的性能分析
Shell排序的时间复杂度在O(nlog2n)和O(n2)间, Knuth的 统计结论是,平均比较次数和记录平均移动次数在n1.25与 1.6n1.25之间
Shell排序是一种不稳定的排序方法
最后谈一下delta的取法。 Shell最初的方案是delta=n/2, delta=delta/2,直到delta=1。Knuth的方案是delta=delta/3 +1。其它方案有:都取奇数为好;或delta互质为好等等。 而使用象1, 2, 4, 8, …或1, 3, 6, 9, …这样的增量序列就不太 合适,因为这样会使几个元素多次被分到一组中,从而造 成重复排序,产生大量无用的比较操作
另外,在无序子表中向前移动的过程中,如果没 有交换元素,则说明无序子表已有序,无须再做 排序
24
冒泡排序算法实现
1 void bubble_sort(RecType R[ ], int n) { 2 //待排序元素用一个数组R表示,数组有n个记录
3 int i, j; 4 bool swap=TRUE; //判断无序子表是否已有序的变量
内排序和外排序 按照排序过程中使用内、外存的不 同将排序方法分为内排序和外排序。若待排序记录全 部在内存中,称为内排序;若待排序记录的数量很大, 以致内存一次不能容纳全部记录,在排序过程中需要 进行内、外存交换,称为外排序。本章仅讨论内排序
内排序可分为五大类:插入排序、交换排序、选择排 序、归并排序和基数排序
直接插入排序(straight insert sort) 折半插入排序(binary insert sort) Shell排序(Shell sort)
10
10.2.1 直接插入排序举例
[新版]什么是内排序
第十章综合题1.什么是内排序? 什么是外排序? 什么排序方法是稳定的? 什么排序方法是不稳定的?2.设待排序的关键字序列为(15, 21, 6, 30, 23, 6′, 20, 17), 试分别写出使用以下排序方法每趟排序后的结果。
并说明做了多少次比较。
(1) 直接插入排序(2) 希尔排序(增量为5,2,1) (3) 起泡排序(4) 快速排序(5) 直接选择排序(6) 锦标赛排序(7) 堆排序(8) 二路归并排序(9) 基数排序3.在起泡排序过程中,什么情况下关键字会朝向与排序相反的方向移动,试举例说明。
在快速排序过程中有这种现象吗?4.快速排序在什么情况下所需关键字的比较次数最多?此时关键字比较次数应为多少?5.用直接插入排序方法对序列(94,32,40,90,80,46,21,69)进行排序(由小到大),试写出排序的过程。
6.已知初始序列为(125 ,11, 22, 34, 15, 44, 76, 66, 100, 8 ,14, 20, 2,5, 1),写出采用希尔排序算法排序的每一趟的结果(增量为5,3,1)。
7.写出对初始序列(50,72,43,85,75,20,35,45,65,30)进行直接选择排序的过程。
8.若用冒泡排序对关键字序列(18,16,14,12,10,8),进行从小到大的排序,所需进行的关键字比较次数是多少。
9.给出关键字序列(27,18,21,77,26,45,66,34),试写出快速排序过程。
10.无序序列为(10,2,13,15,12,14),用堆排序方法从小到大排序,画出堆排序的初态、建堆和重建堆的过程。
11.写出对序列(28,16,32,12,60,2,5,72)进行2路归并排序的过程。
12.给出如下关键字序列(321,156,057,046,028,007,331,033,034,063),试按链式基数排序方法,列出每一趟分配和收集的过程。
13.若参加锦标赛排序的关键字有11个,为了完成排序,至少需要多少次关键字比较?14.手工跟踪对以下各序列进行堆排序的过程。
数据结构答案 第10章 排序学习与指导
第10章排序10.1 知识点分析1.排序基本概念:(1)排序将数据元素的任意序列,重新排列成一个按关键字有序(递增或递减)的序列的过程称为排序。
(2)排序方法的稳定和不稳定若对任意的数据元素序列,使用某个排序方法,对它按关键字进行排序,若对原先具有相同键值元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;反之,则称为不稳定的。
(3)内排序整个排序过程都在内存进行的排序称为内排序,本书仅讨论内排序。
(4)外排序待排序的数据元素量大,以致内存一次不能容纳全部记录,在排序过程中需要对外存进行访问的排序称为外排序。
2.直接插入排序直接插入排序法是将一个记录插到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。
3.二分插入排序二分插入排序法是用二分查找法在有序表中找到正确的插入位置,然后移动记录,空出插入位置,再进行插入的排序方法。
4.希尔排序希尔排序的基本思想是:先选取一个小于n的整数d1作为第一个增量,把待排序的数据分成d1个组,所有距离为d1的倍数的记录放在同一个组内,在各组内进行直接插入排序,每一趟排序会使数据更接近于有序。
然后,取第二个增量d2,d2< d1,重复进行上述分组和排序,直至所取的增量d i=1(其中d i< d i-1 < ……< d2< d1),即所有记录在同一组进行直接插入排序后为止。
5.冒泡排序冒泡法是指每相邻两个记录关键字比大小,大的记录往下沉(也可以小的往上浮)。
每一遍把最后一个下沉的位置记下,下一遍只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束。
6.快速排序快速排序法是通过一趟排序,将待排序的记录组分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好。
第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。
第十章_排序方法(数据结构ppt-严蔚敏)
第二个问题解决方法——筛选
方法:输出堆顶元素之后,以堆中最后一个元素替代之;然 后将根结点值与左、右子树的根结点值进行比较,并与其中 小者进行交换;重复上述操作,直至叶子结点,将得到新的 堆,称这个从堆顶至叶子的调整过程为“筛选”
例 38 50 97 76
13 27 65 49 13 38
97 27 38 50 76
2 (n 4)(n 1) 记录移动次数: (i 1) 2 i 2
i 2 n
若待排序记录是随机的,取平均值 n2 关键字比较次数: T(n)=O(n² ) 4 记录移动次数:
空间复杂度:S(n)=O(1)
n2 4
折半插入排序
排序过程:用折半查找方法确定插入位置的排序叫~
初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp 交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
x 例 初始关键字: 27 49 i 完成一趟排序: ( 27 38 13 49 65 i 13) 49 97 76 j 97 49 13 j 97 65 49 27 50 j 50)
13 38
76 65 27 49
堆排序:将无序序列建成一个堆,得到关键字最小 (或最大)的记录;输出堆顶的最小(大)值后,使 剩余的n-1个元素重又建成一个堆,则可得到n个元素 的次小值;重复执行,得到一个有序序列,这个过程 叫~ 堆排序需解决的两个问题:
如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新 的堆?
按排序所需工作量
数据结构(严蔚敏)第10章
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97 .页 08.06.2020
10. 2 插入排序
.页 08.06.2020
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
无序序列 R[i+1..n]
.页 08.06.2020
实现“一趟插入排序”可分三步进行:
1.在R[1..i-1]中查找R[i]的插入位置,
R[1..j].key R[i].key < R[j+1..i-1].key;
有序序列区 无 序 序 列 区
经过一趟排序
08.06.2020
有序序列区 无 序 序 列 区
.页
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
插入类 交换类 选择类
归并类 其它方法
.页 08.06.2020
#待de排fin记e M录A的XS数IZ据E 类10型00定// 义待排如顺下序:表最大长度
第十章 排序
.页 08.06.2020
【课前思考】
1. 你熟悉排序吗?你过去曾经学过哪些排序方法? 在第一章中曾以选择排序和起泡排序为例讨论算 法实践复杂度,不知你还记得吗? 2. 你自己有没有编过排序的程序?是用的什么策 略?
.页 08.06.2020
【学习目标】
数据结构考研试题精选及答案第10章排序
第10章 排序排序排序一、选择题 1.某内排序方法的稳定性是指.某内排序方法的稳定性是指( )( )( )。
【南京理工大学【南京理工大学 1997 1997 1997 一、一、一、101010((2分)】 A .该排序算法不允许有相同的关键字记录该排序算法不允许有相同的关键字记录 B B B..该排序算法允许有相同的关键字记录记录C .平均时间为0(n log n n log n)的排序方法)的排序方法)的排序方法D D D.以上都不对.以上都不对.以上都不对2.下面给出的四种排序法中下面给出的四种排序法中( )( )( )排序法是不稳定性排序法。
排序法是不稳定性排序法。
【北京航空航天大学北京航空航天大学 1999 1999 1999 一、一、10 10 ((2分)】 A. A. 插入插入插入 B. B. B. 冒泡冒泡冒泡 C. C. C. 二路归并二路归并二路归并 D. D. D. 堆积堆积堆积 3.下列排序算法中,其中(.下列排序算法中,其中( )是稳定的。
)是稳定的。
)是稳定的。
【福州大学【福州大学 1998 1998 1998 一、一、一、3 (23 (2分)】A. A. 堆排序,冒泡排序堆排序,冒泡排序堆排序,冒泡排序B. B. B. 快速排序,堆排序快速排序,堆排序快速排序,堆排序C. C. 直接选择排序,归并排序直接选择排序,归并排序直接选择排序,归并排序D. D. D. 归并排序,冒泡排序归并排序,冒泡排序归并排序,冒泡排序4.稳定的排序方法是(.稳定的排序方法是( )) 【北方交通大学【北方交通大学【北方交通大学 2000 2000 2000 二、二、二、33(2分)】 A .直接插入排序和快速排序.直接插入排序和快速排序 B B B.折半插入排序和起泡排序.折半插入排序和起泡排序.折半插入排序和起泡排序C .简单选择排序和四路归并排序.简单选择排序和四路归并排序D D D.树形选择排序和.树形选择排序和shell 排序排序5.下列排序方法中,哪一个是稳定的排序方法?(.下列排序方法中,哪一个是稳定的排序方法?( ) 【北方交通大学【北方交通大学【北方交通大学 2001 2001 2001 一、一、一、88(2分)】A .直接选择排序.直接选择排序B B B.二分法插入排序.二分法插入排序.二分法插入排序C C C.希尔排序.希尔排序.希尔排序D D D.快速排序.快速排序.快速排序6.若要求尽可能快地对序列进行稳定的排序,则应选(.若要求尽可能快地对序列进行稳定的排序,则应选(A A .快速排序.快速排序 B B B.归并排序.归并排序.归并排序 C C C.冒.冒泡排序)。
数据结构 排序
2019/9/7
30
10.4.1 简单选择排序
待排记录序列的状态为:
有序序列R[1..i-1] 无序序列 R[i..n]
有序序列中所有记录的关键字均小于无序序列中记 录的关键字,第i趟简单选择排序是从无序序列 R[i..n]的n-i+1记录中选出关键字最小的记录加入 有序序列
2019/9/7
5
排序的类型定义
#define MAXSIZE 20 // 待排序记录的个数
typedef int KeyType;
typedef struct
{ KeyType key;
InfoType otherinfo; ∥记录其它数据域
} RecType;
typedef struct {
RecType r[MAXSIZE+1];
分别进行快速排序:[17] 28 [33] 结束 结束
[51 62] 87 [96] 51 [62] 结束
结束
快速排序后的序列: 17 28 33 51 51 62 87 96
2019/9/7
26
自测题 4 快速排序示例
对下列一组关键字 (46,58,15,45,90,18,10,62) 试写出快速排序的每一趟的排序结果
final↑ ↑first
i=8
[51 51 62 87 96 17 28 33]
final↑ ↑first
2019/9/7
14
希尔(shell )排序
基本思想:从“减小n”和“基本有序”两 方面改进。
将待排序的记录划分成几组,从而减少参 与直接插入排序的数据量,当经过几次分 组排序后,记录的排列已经基本有序,这 个时候再对所有的记录实施直接插入排序。
第10章 排序
第十章排序一、单项选择题1.有一组序列48,36,68,99,75,24,58,52进行快速排序,要求结果按从小到大排序,则进行一次划分之后结果为_____。
A. (24 28 36) 48 (52 68 75 99)B. (28 36 24) 48 (75 99 68 52)C. (36 68 99) 48 (75 24 28 52)D. (28 36 24) 48 (99 75 68 52)2.已知两个有序表,若要将它们组合成一个新的有序表,最好的方法是_____。
A. 希尔排序B. 二分插入排序C. 合并排序D. 冒泡排序3.排序译意风稳定的和不稳定的之分,下列四个说法中,只有______是正确的。
A. 快速排序是稳定的排序方法B. 堆排序是不稳定的排序方法C. 希尔排序是稳定的排序方法D. 冒泡排序是不稳定的排序方法4. 下列排序方法中,____方法是不稳定的。
A. 冒泡排序B. 希尔排序C. 冒泡排序D. 直接插入排序5. 下列排序方法中,在待排序的数据已经有序时,花费时间反而最多的是______。
A.快速排序B. 希尔排序C. 冒泡排序D. 堆排序6. 快速排序方法在最好情况下的时间复杂度为______。
A. O(n)B. O(n2)C. O(nlog2n)D.(log2n)7. 下列排序方法中,时间复杂度不受数据初始状态影响,恒为O(n2)的是_______。
A. 堆排序B.冒泡排序C. 直接选择排序D.快速排序8. 依次将待排序序列中的元素和有序子序列合并为一个新的有序子序列的排序方法是____。
A. 快速排序B.插入排序C. 冒泡排序D. 堆排序9. 在表R中排序前已按键值递增顺序排序,则_____方法的比较次数最少。
A. 直接插入排序B. 快速排序C. 归并排序D. 选择排序10. 已知表A中每个元素距其最终位置不远,采用______方法最节省时间。
A. 堆排序B. 冒泡排序C. 快速排序D. 直接选择排序11. 在下列排序方法中,字比较的次数与记录的初始排列次序无关的是______。
第10章 内部排序答案
第10章内部排序答案一、填空题1. 大多数排序算法都有两个基本的操作:比较(两个关键字的大小)和移动(记录或改变指向记录的指针)。
2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较3次。
(可约定为,从后向前比较)3. 在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选用选择排序。
4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本无序,则最好选用快速排序。
5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2) 。
若对其进行快速排序,在最坏的情况下所需要的时间是O(n2) 。
6. 对于n个记录的集合进行归并排序,所需要的平均时间是O(nlog2n) ,所需要的附加空间是O(n) 。
7.【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行log2n 趟(遍),共计移动n log2n次记录。
(即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素)8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则:冒泡排序一趟扫描的结果是H, C, Q, P, A, M, S, R, D, F, X ,Y;初始步长为4的希尔(shell)排序一趟的结果是P, A, C, S, Q, D, F, X , R, H,M, Y;二路归并排序一趟扫描的结果是H, Q, C, Y,A, P, M, S, D, R, F, X ;快速排序一趟扫描的结果是F, H, C, D, P, A, M, Q, R, S, Y,X;堆排序初始建堆的结果是Y, S, X, R, P, C, M, H, Q, D, F, A。
9. 在堆排序、快速排序和归并排序中,若只从存储空间考虑,则应首先选取堆排序方法,其次选取快速排序方法,最后选取归并排序方法;若只从排序结果的稳定性考虑,则应选取归并排序方法;若只从平均情况下最快考虑,则应选取快速排序方法;若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。
数据结构第10章排序练习及答案
9.1选择题1.从末排序的序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在排序序列的合适位置,该排序方法称为()排序法。
A)插入B)选择C)希尔D)二路归并【答案】A2.下面各种排序方法中,最好情况下时间复杂度为O(n)的是()A)快速排序B)直接插入排序C)堆排序D)归并排序【答案】B3.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,无序序列的变化情况如下:25 84 21 47 15 27 68 35 2020 15 21 25 47 27 68 35 8415 20 21 25 35 27 47 68 8415 20 21 25 27 35 47 68 84则所采用的排序方法是()A)选择排序B)希尔排序C)归并排序D)快速排序【答案】D4.下面给出的四种排序法中,()排序是不稳定排序法。
A)插入B)冒泡C)二路归并D)堆【答案】D5.快速排序方法在()情况下最不利于发挥其长处。
A)要排序的数据量太大B)要排序的数据中含有多个相同值C)要排序的数据已基本有序D)要排序的数据个数为奇数【答案】C6.一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()A)38,40,46,56,79,84B)40,38,46,79,56,84C)40,38,46,56,79,84D)40,38,46,84,56,79【答案】C7.对记录的关键码{50,26,38,80,70,90,8,30,40,20}进行排序,各趟排序结束时的结果为:50,26,38,80,70,90 ,8,30,40,2050,8,30,40,20,90,26,38,80,7026,8,30,40,20,80,50,38,90,708,20,26,30,38,40,50,70,80,90其使用的排序方法是()A)快速排序B)基数排序C)希尔排序D)归并排序【答案】C8.以下序列不是堆的是()A)100,85,98,77,80,60,82,40,20,10,66B)100,98,85,82,80,77,66,60,40,20,10C)10,20,40,60,66,77,80,82,85,98,100D)100,85,40,77,80,60,66,98,82,10,20【答案】D【解析】根据堆采用完全二叉树的顺序存储形式及堆的特点,因第一个结点即根结点关键字值最大,则应建立一个大根堆,但依据此数据序列建立起堆后关键字值为40的左右孩子结点分别为60、66,不符合大根堆特点。
数据结构Ch10习题答案
第十章内部排序一、择题1.用直接插入排序法对下面四个表进行(由小到大)排序,比较次数最少的是(B)。
A.(94,32,40,90,80,46,21,69)插32,比2次插40,比2次插90,比2次插80,比3次插46,比4次插21,比7次插69,比4次B.(21,32,46,40,80,69,90,94)插32,比1次插46,比1次插40,比2次插80,比1次插69,比2次插90,比1次插94,比1次C.(32,40,21,46,69,94,90,80)插40,比1次插21,比3次插46,比1次插69,比1次插94,比1次插90,比2次插80,比3次D.(90,69,80,46,21,32,94,40)插69,比2次插80,比2次插46,比4次插21,比5次插32,比5次插94,比1次插40,比6次2.下列排序方法中,哪一个是稳定的排序方法(BD)。
A.希尔排序B.直接选择排序C.堆排序D.冒泡排序下列3题基于如下代码:for(i=2;i<=n;i++){ x=A[i];j=i-1;while(j>0&&A[j]>x){ A[j+1]=A[j];j--;}A[j+1]=x}3.这一段代码所描述的排序方法称作(A)。
A.插入排序B.冒泡排序C.选择排序D.快速排序4.这一段代码所描述的排序方法的平均执行时间为(D)A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)5.假设这段代码开始执行时,数组A中的元素已经按值的递增次序排好了序,则这段代码的执行时间为(B)。
A.O(log2n) B.O(n) C.O(nlog2n) D.O(n2)6.在快速排序过程中,每次被划分的表(或了表)分成左、右两个子表,考虑这两个子表,下列结论一定正确是(B)。
A.左、右两个子表都已各自排好序B.左边子表中的元素都不大于右边子表中的元素C.左边子表的长度小于右边子表的长度D.左、右两个子表中元素的平均值相等7.对n个记录进行堆排序,最坏情况下的执行时间为(C)。
数据结构1800试题-第10章 排序 - 答案
第10章排序(参考答案)部分答案解释如下:18. 对于后三种排序方法两趟排序后,序列的首部或尾部的两个元素应是有序的两个极值,而给定的序列并不满足。
20. 本题为步长为3的一趟希尔排序。
24.枢轴是73。
49. 小根堆中,关键字最大的记录只能在叶结点上,故不可能在小于等于n/2的结点上。
64. 因组与组之间已有序,故将n/k个组分别排序即可,基于比较的排序方法每组的时间下界为O(klog2k),全部时间下界为O(nlog2k)。
二、判断题5. 错误。
例如冒泡排序是稳定排序,将4,3,2,1按冒泡排序排成升序序列,第一趟变成3,2,1,4,此时3就朝向最终位置的相反方向移动。
12. 错误。
堆是n个元素的序列,可以看作是完全二叉树,但相对于根并无左小右大的要求,故其既不是二叉排序树,更不会是平衡二叉树。
22. 错误。
待排序序列为正序时,简单插入排序比归并排序快。
三、填空题1. 比较,移动2.生成有序归并段(顺串),归并3.希尔排序、简单选择排序、快速排序、堆排序等4. 冒泡,快速5. (1)简单选择排序 (2)直接插入排序(最小的元素在最后时)6. 免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。
7. n(n-1)/28.题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。
(1)!=null (2)p->next (3)r!=null (4)r->data<q->data(5)r->next (6)p->next9. 题中为操作方便,先增加头结点(最后删除),p指向无序区的前一记录,r指向最小值结点的前驱,一趟排序结束,无序区第一个记录与r所指结点的后继交换指针。
(1)q->link!=NULL (2)r!=p (3)p->link (4)p->link=s (5)p=p->link10.(1)i<n-i+1 (2)j<=n-i+1 (3)r[j].key<r[min].key (4)min!=i (5)max==i(6)r[max]<-->r[n-i+1]11.(1)N (2)0 (3)N-1 (4)1 (5)R[P].KEY<R[I].KEY (6)R[P].LINK(7)(N+2)(N-1)/2(8)N-1 (9)0 (10)O(1)(每个记录增加一个字段) (11)稳定(请注意I的步长为-1)12. 3,(10,7,-9,0,47,23,1,8,98,36) 13.快速14.(4,1,3,2,6,5,7)15.最好每次划分能得到两个长度相等的子文件。
严蔚敏版《数据结构(C语言版)》-内部排序-第10章
high=mid-1 ; else low=mid+1 ;
}
/* 查找插入位置 */
for (j=i-1; j>=high+1; j--)
L->R[j+1]=L->R[j];
L->R[high+1]=L->R[0]; /* 插入到相
应位置 */
}
}
从时间上比较,折半插入排序仅仅减少了关键字的 比较次数,却没有减少记录的移动次数,故时间复杂度 仍然为O(n2) 。
待排序的记录类型的定义如下:
#define MAX_SIZE 100
Typedef int KeyType ;
typedef struct RecType
{ KeyType key ;
/* 关键字码 */
infoType otherinfo ; /* 其他域 */
}RecType ;
typedef struct Sqlist
③ 记录存储在一组连续地址的存储空间:构造另一 个辅助表来保存各个记录的存放地址(指针) :排序 过程不需要移动记录,而仅需修改辅助表中的指针, 排序后视具体情况决定是否调整记录的存储位置。
①比较适合记录数较少的情况;而②、③则适合 记录数较少的情况。
为讨论方便,假设待排序的记录是以①的情况存 储,且设排序是按升序排列的;关键字是一些可直接用 比较运算符进行比较的类型。
(n-1)(n+1)
2
移动次数:∑n (i+1)=
i=2
(n-1)(n+4)
2
一般地,认为待排序的记录可能出现的各种排列的
概率相同,则取以上两种情况的平均值,作为排序的关
数据结构第十章 排序
10.2 插入排序 插入排序
直接插入排序 折半插入排序 2-路插入排序 表插入排序 希尔排序
10.2.1 直接插入排序
基本操作:将一个记录插入到已排好序的有序表中, 从而得到一个新的、记录数增1的有序表。
例:有一组待排序的记录的关键字初始序列如下:
(49,38,65,97,76,13,27,49`)
(4)归并排序 (5)基数排序
按内排过程中所需的工作量分类:
(1)简单的排序方法,其时间复杂度为O(n×n)
(2)先进的排序方法,其时间复杂度为O(nlogn);
(3)基数排序,其时间复杂度为O(d(n+rd))
排序算法的两种基本操作:
(1)比较两个关键字的大小; (2)将记录从一个位置移至另一个位置;
算法实现的关键设计:
将d看成是一个循环数组,并设两个指针first和final分别指示排序过 程中得到的有序序列中的第一个记录和最后一个记录在d中的位置.
例:有一组待排序的记录的关键字初始排列如下:
(49,38,65,97,76,13,27,49`) 16
[初始关键字] 49 38 65 97 76 13 27 49`
18
10.2.3 希尔排序 从直接插入排序
待排序序列基本有序可提高效率 回顾 待排序序列的记录数n很小时可提高效率
希尔排序的基本思想:
先将整个待排记录序列分割成为若干子序列分别进行
直接插入排序,待整个序列中的记录“基本有序”时,再对 全
体记例录:有进一行组一待次排直序接的插记入录排的序关. 键字初始排列如下: (49,38,65,97,76,13,27,49`)
} 12
直接插入排序的性能分析: 10. 3
(1)空间:只需一个记录的辅助空间r[0].
第10章 排序(3)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
12/41
排序区间是R[s..t](为大问题),当其长度为0或者1时,本身就是有 序的,不做任何处理。
否则,其中间位置m,采用相同方法对R[s..m]和R[m+1..t]排好序(分 解为两个小问题),再调用前面的二路归并算法Merge(s,m,t)得到整 个有序表(合并)。
f(R,s,t) ≡ 不做任何事情
int i=low,j=mid+1,k=0;
//k是R1的下标,i、j分别为第1、2段的下标
while (i<=mid && j<=high)
//在第1段和第2段均未扫描完时循环
if (R[i].key<=R[j].key) //将第1段中的元素放入R1中
{ R1[k]=R[i];
i++; k++; }
空间复杂度为O(high-low+1)
else
//将第2段中的元素放入R1中
{ R1[k]=R[j];
j++; k++;
}
while (i<=mid)
//将第1段余下部分复制到R1
{ R1[k]=R[i];
i++; k++;
}
while (j<=high)
//将第2段余下部分复制到R1
{ R1[k]=R[j];
j++; k++;
}
for (k=0,i=low;i<=high;k++,i++)
//将R1复制回R中
R[i]=R1[k];
}
5/41
生态学:第10章 群落的分类与排序
40 37 60 似
D 70 50 60
87 50 系
数
E 73 53 63 13
F 40 60 40 50 47
相异系数
1、计算样方间相异系数矩阵,Bray & Curtis (1975) 距离公式如下:
2、选择 x 轴的端点,即选择相异系数最大的两个样方(A、E)作为第一排序轴的端 点,其中一个坐标值记为0,另一个坐标值等于两端点的相异系数。
根据上述系统,中国植被分为: 10个植被型组、29个植被型、560多个群系、几千个群丛。
一、针叶林(植被型组) 1. 寒温性针叶林(植被型) 2. 温性针叶林 3. 温性针阔叶混交林 4. 暖性针叶林 5. 热性针叶林
二、阔叶林
落
6. 落叶阔叶林
叶
阔
7. 常绿、落叶阔叶混交林
叶
林
8. 常绿阔叶林
样方2
0
5.866
3′″
0
由此已将全部样方合成一组,得到整个聚合过程的树状图为:
6个样方组平均法的聚合分类结果
10.2 群落排序 (ordination) 10.2.1 排序的概念 ✓ 定义:把一个地区内所调查的群落样地,按照相似度 (similarity) 来排定各样地的
位序,从而分析各样地之间以及与生境之间的相互关系。
草甸
沼泽
水生植被
10.1.2 植物群落的命名 联名法(中国):将各个层中的建群种或优势种和生态指示种的学名按顺序排列。 • 在前面冠以Ass. • 不同层的优势种用“-”相连(如:“马尾松 - 桃金娘 - 芒萁”群丛) • 某一层具共优种时,用“+”相连(如:“马尾松 + 藜蒴 - 桃金娘 - 芒萁”群丛) • 当最上层的植物不是群落的建群种,而是伴生种或景观植物,这时用“<”来表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (L.r[0].key < L.r[m].key) high = m-1; // 插入点在低半区
else low = m+1; // 插入点在高半区
}
10.2 插入排序
其他插入排序
•2-路插入排序 是在折半插入排序的基础上改进得到的。其目的 是减少排序过程中移动的记录次数,但为此需要n个记 录的辅助空间。(见P267)
else if(L.r[i].key>d[final].key) { /* 待插记录大于d中最大值,插到d[final]之后(不需移动d 数组的元素) */ final=final+1; d[final]=L.r[i]; } else { /* 待插记录大于d中最小值,小于d中最大值,插到d的 中间(需要移动d数组的元素) */ j=final++; /* 移动d的尾部元素以便按序插入记录 */ while(L.r[i].key<d[j].key) { d[(j+1)%L.length]=d[j]; j=(j-1+L.length)%L.length; } d[j+1]=L.r[i]; } for(i=1;i<=L.length;i++) /* 把d赋给L.r */ L.r[i]=d[(i+first-1)%L.length]; /* 线性关系 */
0
MAXINT 初始状态
1
49 0 49 0 49 3 49 3
2
38
3
65 65 65 0 65 4
4
97 97 97 97 0
5
76 76 76 76 -
6
13 13 13 13 -
7
27 27 27 27 -
8
49 49 49 49 -
1
MAXINT
38 1 38 1 38 1
i=2
2
MAXINT
i=3
2
MAXINT
i=4
2
0
MAXINT i=5
1
49 3
2
38 1
3
65 5
4
97 0
5
76 4
6
13 -
7
27 -
8
49 -
2
MAXINT
49 3 49
3 49 8
38 1 38
1 38 1
65 5 65
5 65 5
97 0 97
0 97 0
76 4 76
4 76 4
13 2 13
7 13 7
干子序列,分别对各子序列进行简单排序,直到整个 序列有序。 o划分序列:子序列个数序列,如: n/2, n/4, n/8, ... 2, 1 21, 13, 8, 5, 3, 2, 1(, 1) o划分序列原则:递减,以1结束。
选用划分序列:5, 3, 2, 1
21
14
52
77
35
29
87
24
55
其他插入排序
•表插入排序
10.2 插入排序
以静态链表类型作为待排序记录序列的存储结构, 并设数组中下标为“0”的分量为表头结点,令表头结 点记录的关键字取最大整数MAXINT。则表插入排序的 过程为:首先将静态链表中数组的下标为“1”的分量 按记录关键字非递减有序插入到循环链表中。 表插入排序的结果只是求得一个有序链表,则只 能对它进行顺序查找,不能进行随机查找。
实现“一趟插入排序”可分三步进行:
1.在R[1..i-1]中查找R[i]的插入位臵; R[1..j].key R[i].key < R[j+1..i-1].key 2.将R[j+1..i-1]中的所有记录均后移 一个位臵; 3.将R[i] 插入(复制)到R[j+1]的位臵上。
10.2 插入排序
typedef struct { KeyType key; // 关键字项 InfoType otherinfo; // 其它数据项 } RedType; // 记录类型 typedef struct { RedType r[MAXSIZE+1]; // r[0]闲臵 int length; // 顺序表长度 } SqList; // 顺序表类型
38
21 21 21 14
14 14 14 21
24 24 24 24
55 38 29 29
35 35 35 35
29 29 38 38
87 55 55 52
52 52 52 55
77 77 77 77
38 87 87 87
void ShellInsert ( SqList &L, int dk ) { for ( i=dk+1; i<=n; ++i ) if ( L.r[i].key< L.r[i-dk].key) { L.r[0] = L.r[i]; // 暂存在L.r[0] for (j=i-dk; j>0&&(L.r[0].key<L.r[j].key); j-=dk) L.r[j+dk] = L.r[j]; // 记录后移,查找插入位臵 L.r[j+dk] = L.r[0]; // 插入 } // if } // ShellInsert
序列{21,25,49,25*,16,08}用线性插入排序的过程 1 2 3 4 5 6 21 25 49 25* 16 08
0 25 1 21 2 25 3 49 4 5 25* 16 6 08
第1趟
21
25 21 21
25
25 25
49
49 49
25* 16
25* 16 25* 16
08
08 08
再如:
插入 位置
m
i
L.r 14 36 49 52 58 61 80 23 97 75
low high low high m m m high
void BiInsertionSort ( SqList &L ) { for ( i=2; i<=L.length; ++i ) { L.r[0] = L.r[i]; // 将 L.r[i] 暂存到 L.r[0] 在 L.r[1..i-1]中折半查找插入位臵;
for ( j=i-1; j>=high+1; --j ) L.r[j+1] = L.r[j]; // 记录后移 L.r[high+1] = L.r[0]; // 插入 } // for } // BInsertSort
low = 1; high = i-1;
while (low<=high) { m =ห้องสมุดไป่ตู้(low+high)/2; // 折半
10.2 插入排序
直接插入排序
是一种最简单的排序方法,它的基本操作是将一个记 录插入到已排好序的有序表中,从而得到一个新的、记录 数增1的有序表。
E1:将待排序序列看作由已排序序列和未排序序列两部
分构成,初始时,取第一个元素为已排序序列,剩余元素 为未排序序列;
E2:循环直到未排序序列为空
–E21:任取未排序序列中的一个元素,插入到已排序 序列中;
10.2 插入排序
其他插入排序
•折半插入排序
在线性插入排序中,将元素插入到有序区的过程, 实际上是对有序区进行顺序查找的过程。由于有序区 已经有序,所以可以用对分查找来取代原来的顺序查 找,以提高效率。
例如:
插入 位置
i
L.r 14 36 49 52 80 58 61 23 97 75
low
high low high low m m
10.1 概述
排序方法的稳定性
–假设ki=kj,且在排序前的序列中Ri领先于Rj。若在排序 后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的。 –反之,若可能使排序后的序列中Rj领先于Ri,则称所用 的排序方法是不稳定的。
内部排序的概念
–待排序记录存放在计算机随机存储器中进行的排序过程 称为内部排序。 –待排序记录的数量很大,以致内存一次不能容纳全部记 录,在排序过程中尚需对外存进行访问的排序过程称为外 部排序。
27 27
2 27 2
49 49
49 3
i=6
6
MAXINT
i=7
6
MAXINT
i=8
6
希尔排序(又称缩小增量排序)
基本思想:对待排记录序列先作“宏观”调整,再 作“微观”调整。 所谓“宏观”调整,指的是,“跳跃式” 的插入排序。
10.2 插入排序
希尔排序
•基本思想
o依指定划分序列将待排序序列划分为交叉在一起的若
第2趟
0
1
2
3
4
5
6
第3趟
25*
21
21
25
25
49
25*
25* 16
49 16
08
08
16
21 16
25 21
25* 25
49
16
08 08
第4趟
25* 49
第5趟
08
16 08
21 16
25 21
25* 49 25
08
25* 49
#define MAXSIZE 1000 // 待排顺序表最大长度 typedef int KeyType; // 关键字类型为整数类型
void ShellSort (SqList &L, int dlta[], int t)
{ // 增量为dlta[]的希尔排序 for (k=0; k<t; ++t)