13、第九章 排序
数据结构第九章排序习题与答案

习题九排序一、单项选择题1.下列内部排序算法中:A.快速排序 B.直接插入排序C. 二路归并排序D.简单选择排序E. 起泡排序F.堆排序(1)其比较次数与序列初态无关的算法是()(2)不稳定的排序算法是()(3)在初始序列已基本有序(除去n 个元素中的某 k 个元素后即呈有序, k<<n)的情况下,排序效率最高的算法是()(4)排序的平均时间复杂度为O(n?logn)的算法是()为 O(n?n) 的算法是()2.比较次数与排序的初始状态无关的排序方法是( )。
A.直接插入排序B.起泡排序C.快速排序D.简单选择排序3.对一组数据( 84, 47, 25, 15, 21)排序,数据的排列次序在排序的过程中的变化为(1) 84 47 25 15 21(2) 15 47 25 84 21(3) 15 21 25 84 47(4) 15 21 25 47 84则采用的排序是 ()。
A. 选择B.冒泡C.快速D.插入4.下列排序算法中 ( )排序在一趟结束后不一定能选出一个元素放在其最终位置上。
A. 选择B.冒泡C.归并D.堆5.一组记录的关键码为(46,79,56, 38,40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。
A. (38,40,46,56,79,84) B. (40,38,46,79,56,84)C. (40,38,46,56,79,84) D. (40,38,46,84,56,79)6.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是()排序。
A.冒泡 B. 希尔C. 快速D. 堆7.就平均性能而言,目前最好的内排序方法是() 排序法。
A. 冒泡B.希尔插入C.交换D.快速8.下列排序算法中,占用辅助空间最多的是:()A. 归并排序B.快速排序C.希尔排序D.堆排序9.若用冒泡排序方法对序列 {10,14,26,29,41,52}从大到小排序,需进行()次比较。
数据结构第9章 排序

R[3] 10
R[4] 60
R[5] 25
R[6] 30
R[7] 18 18 18 18
18 36 20
10 10 36
60 60 60
25 25 25
30 30 30
【算法】直接插入排序 void D_InsertSort(datatype R[ ], int n) { /*对排序表R[1]..R[n]进行直接插入排序,n是记录的 个数*/ for(i=2; i<=n; i++) if (R[i].key<R[i-1].key) {R[0]=R[i]; /*将R[i]插入R[1].. R[i-1]中, R[0]为监测哨*/ for(j=i-1; R[0].key<R[j].key; j--) R[j+1]=R[j]; /*后移记录*/ R[j+1]=R[0]; /*插入到合适位置*/ } }
空间性能:除排序表以外的内存占用情况。 时间性能:比较关键码的次数,数据移动的次数。 它们往往是排序表规模(n)的函数
6. 记录和排序表的数据结构
一般采用顺序结构存储排序表。 记录和排序表的类型定义如下: #define MAXNUM … /* MAXNUM 为足够大的数 typedef struct { keytype key; …… } datatype; datatype R[MAXNUM]; /*关键码字段*/ /*其它信息*/ /*记录类型*/ /*定义排序表的存储
第一趟排序结果,使得间隔为5的字表有序: P=3
29 7 41 30 11 39 50 76 41 13 10 0 80 78 86
子序列分别为:{29,30,50,13,78},{7,11,76,100,86}, {41,39,41,80}。第二趟排序结果: P=1
第9章排序ppt课件-PPT文档资料

} // ShellSort void Shellinsert ( SqList &L, int dk )
(1) 前后记录位置的增量是 dk,而不是 1; (2) r[0] 只是暂存单元,而不是哨兵。当 j <= 0 时, 插入位置已经找到。*/
// 复制为哨兵
for ( j = i-1; L.r[0].key < L.r[j].key ); --j )
// 记录后移 // 插入到正确位置
12
(3) 算法分析
① 假定待排序列中的记录有 n 个,当待排序列中 的记录按关键字非递减有序排序(简称正序)时,所需 要进行的关键字之间比较的次数达最小值 n-1,记录不 需要移动;反之,当待排序列中的记录按关键字非递增
4
(3) 内部排序和外部排序
排序可以分为内部排序和外部排序两类。
在排序过程中,如果线性表的全部结点都在内存,
并且在内存中调整它们在线性表中的存储顺序,则称这
种排序方法为内部排序,简称内排序。 在排序过程中,如果线性表只有部分结点被调入内 存,并且借助内存调整结点在外存中的存放顺序,则称 这种排序方法为外部排序,简称外排序。
方法。D.L.shell 在 1959 年提出了希尔排序 (shell sort),
1 直接插入排序
2 希尔排序
9
1. 直接插入排序
(1) 算法思想 直接插入排序的基本思想是:逐个处理待排序列中 的记录,将其与前面已经排好序的子序中的记录进行比 较,确定要插入的位置,并将记录插入到子序中。具体
做法如下:
第9章 排序
2
9.1 基本概念
(1) 排序 对于有 n 个结点的线性表 (e0, e1, …, en-1),按照结 点某些数据项的关键字按递增或者递减的次序,重新
数据结构第9章 排序

数据结构第9章排序数据结构第9章排序第9章排名本章主要内容:1、插入类排序算法2、交换类排序算法3、选择类排序算法4、归并类排序算法5、基数类排序算法本章重点难点1、希尔排序2、快速排序3、堆排序4.合并排序9.1基本概念1.关键字可以标识数据元素的数据项。
如果一个数据项可以唯一地标识一个数据元素,那么它被称为主关键字;否则,它被称为次要关键字。
2.排序是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。
如果排序依据的是主关键字,排序的结果将是唯一的。
3.排序算法的稳定性如果要排序的记录序列中多个数据元素的关键字值相同,且排序后这些数据元素的相对顺序保持不变,则称排序算法稳定,否则称为不稳定。
4.内部排序与外部排序根据在排序过程中待排序的所有数据元素是否全部被放置在内存中,可将排序方法分为内部排序和外部排序两大类。
内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将一部分数据元素放在内存中,另一部分放在外围设备上。
整个排序过程需要在内存和外存之间进行多次数据交换才能得到排序结果。
本章仅讨论常用的内部排序方法。
5.排序的基本方法内部排序主要有5种方法:插入、交换、选择、归并和基数。
6.排序算法的效率评估排序算法的效率主要有两点:第一,在一定数据量的情况下,算法执行所消耗的平均时间。
对于排序操作,时间主要用于关键字之间的比较和数据元素的移动。
因此,我们可以认为一个有效的排序算法应该是尽可能少的比较和数据元素移动;第二个是执行算法所需的辅助存储空间。
辅助存储空间是指在一定数据量的情况下,除了要排序的数据元素所占用的存储空间外,执行算法所需的存储空间。
理想的空间效率是,算法执行期间所需的辅助空间与要排序的数据量无关。
7.待排序记录序列的存储结构待排序记录序列可以用顺序存储结构和和链式存储结构表示。
在本章的讨论中(除基数排序外),我们将待排序的记录序列用顺序存储结构表示,即用一维数组实现。
第9章排序(下)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社

外
排
5(-∞)
17
5
10
序
F0
F1
F2
F3 29 F4 15
每个叶子结点对应一个归并段,段号为0~4。 初始时每个分支结点(含冠军结点)取值“5(- ∞)”,5表示段 号(此时为虚拟段号),- ∞表示最小关键字。例如,某结点取值 为“4(15)”,表示结点值来自4号段的关键字15对应的记录。
15(5-)∞) 冠军(最小者)
9.7
1. k路平衡归并的效率分析
k=2时,采用平衡归并时,如果初始归并段有m个,那么这样的归
并树就有log2m+1层。
外 排
要对数据进行log2m趟扫描。
序
说明:如果所有初始归并段的长度(初始归并段中的记录个
数)相等或大致相等,可采用k路平衡归并。
9.7
例如:二路平衡归并 初始序列:(5,4,1,6,8,3,2,7)
9.7
若有m个初始归并段,共u个记录 归并趟数=logkm k越大,WPL越少,则读写记录的次数越少。
外
排
在内存空间允许的情况下,k越大越好!
序
9.7
k路平衡归并的关键字比较时间分析:
若在归并中采用简单选择方法,每次在k个记录中选择最 小者,需要关键字比较k-1次。
每 趟 归 并 u 个 记 录 需 要 做 (u-1)*(k-1) 次 比 较 , s= logkm)趟归并总共需要的关键字比较次数为:
某种内排序方法
外
排
文件Fin.dat
容量为750个记录
序
(含4500个记录)
产生6个长度为 750个记录的有序 文件F1~F6。
第一阶段
第二阶段:归并过程
第9章_排序

比较次数的最大值 (n i) n(n 1) / 2 O(n2 ) i 1
n1
移动次数的最大值 3(n i) 3n(n 1) / 2 O(n2 ) i 1
冒泡排序方法是稳定的。
9.3.2 快速排序
快速排序的基本思想
快速排序方法是一种所需比较次数较少、在 内部排序中速度比较快的排序方法。
其思想是在待排序的记录序列中任取某个记 录(作为基准)的值作为控制值,采用某种 方法把这个记录放到适当的位置,使得这个 位置的左边的所有记录的值都小于或等于这 个控制值,而这个位置的右边的所有记录的 值都大于或等于这个控制值。
例9.4 (a) 一趟快速排序示例(一次划分过程)
49 38 65 97 76 13 27 49’
排序 所谓排序(Sort),就是要整理文件中的 记录,使它们按关键字递增(或递减)次序重新排 列。排序的确切定义为: 假设文件中有n个记录R1,R2,…Rn,其相应的 关键字分别为K1,K2,…Kn。所谓排序,是需要将 这Ki1n≤个Ki记2≤录…重≤K新in(排或列Ki为1 ≥RKi1i2,R≥i…2,…≥RKiinn,)使。得
例9.1 直接插入排序举例
[初始关键字]
i=2 (38) i=3 (65) i=4 (97) i=5 (76) i=6 (13) i=7 (27) i=8 (49)
监视哨R[0]
[49] 38 65 97 76 13 27 49
[38 49] 65 97 76 13 27 49 [38 49 65] 97 76 13 27 49 [38 49 65 97] 76 13 27 49 [38 49 65 76 97] 13 27 49 [13 38 49 65 76 97] 27 49 [13 27 38 49 65 76 97] 49 [13 27 38 49 49 65 76 97]
数据结构第九章 排序题库(40道)

数据结构第九章排序1、内排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为( )。
——[单选题]A 希尔排序B 冒泡排序C 直接插入排序D 简单选择排序正确答案:C2、对有n个记录的表进行直接插入排序,在最坏情况下需进行( )次关键字比较。
——[单选题]A n-1B n+1C n/2D n(n-1)/2正确答案:D3、在下列算法中,( )算法可能出现下列情况:在最后一趟开始之前,所有的元素都不在其最终的位置上。
——[单选题]A 堆排序B 冒泡排序C 直接插入排序D 快速排序正确答案:C4、对数据序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排序变为{9,15,7,8,20,-1,4},则采用的是( )算法。
——[单选题]A 简单选择排序B 冒泡排序C 直接插入排序D 堆排序正确答案:C5、数据序列{5,4,15,10,3,1,9,6,2}是某排序方法第一趟后的结果,该排序算法可能是( )。
——[单选题]A 冒泡排序B 二路归并排序C 堆排序D 简单选择排序正确答案:B6、从未排序序列中挑选元素,并将其依次插入已排序序列的一端的方法,称为( )。
——[单选题]A 希尔排序B 归并排序C 直接插入排序D 简单选择排序正确答案:D7、在以下排序方法中,关键字比较的次数与元素的初始排列次序无关的是( )。
——[单选题]A 希尔排序B 冒泡排序C 插入排序D 简单选择排序正确答案:D8、对n个不同的关键字进行递增冒泡排序,在下列哪种情况下比较的次数最多( )。
——[单选题]A 元素无序B 元素递增有序C 元素递减有序D 都一样正确答案:C9、对数据序列(8,9,10,4,5,6,20,1,2)进行递增排序,采用每趟冒出一个最小元素的冒泡排序算法,需要进行的趟数至少是( )。
——[单选题]A 3B 4C 5D 8正确答案:C10、为实现快速排序法,待排序序列最好采用的存储方式是( )。
北京师范大学数据结构教学资料 第9章——排序

for (i = left+1; i <= right; i++) if (L[i] < L[i-1]) { temp = L[i]; j = i-1;
精选PPT
140-12
do { L[j+1] = L[j]; j--;
} while (j >= left && temp < L[j]); L[j+1] = temp; } }
140-7
各 趟 排 序 结 果 i=1
i=2
21 25 49 25* 16 08 012345
21 25 49 25* 16 08 012345
25 temp
21 25 49 25* 16 08 012345
精选PPT
49
temp
140-8
i=3 i=4 i=5
21 25 49 25* 16 08
int Partition (const int low, const int high); //快速排序划分
orting)
基本方法是:每步将一个待排序的元素,按其 排序码大小,插入到前面已经排好序的一组元 素的适当位置上, 直到元素全部插入为止。
16 temp
21 25 25*16 49 49 08
012345
精选PPT
16
temp
140-10
i=4 j=1
i=4 j=0
21 25 1625* 25* 49 08
16
012345
16 21 25
25
25*
49
08
012345
16 temp
i=4 j = -1
《数据结构与算法》第九章排序.

if(elem[j].key>elem[j+1].key) 19237 27 49 65
elem[ j ] elem[ j + 1 ] 42979 49 76
}
4979 97
}
n1 n(n 1)
i
i 1
2
时间复杂度T(n) = O(n2)
初 第 第 第 第 第第第 始 一 二 三 四 五六七 关 趟 趟 趟 趟 趟趟趟 键 排 排 排 排 排排排 字 序 序 序 序 序序序
9.1 概述
排例序::将将关数键据字元序素列的:一52个4任9意80序3列6 1,4重58新6排1列23成一 调个整按为关:键1字4 有23序3的6 序49列5。2 58 61 80
假设含 n 个记录的序列为{ R1, R2, …, Rn },其相应 的关键字序列为 { K1, K2, …, Kn }
i1
2
练习
• 简单选择排序是一种不稳定的排序方法。 • 请举例说明。
(1) 21 25 49 25* 16 08
9.5.2 堆排序
▪ 堆排序是选择排序的改进(1964提出)。 ▪ 在排序过程中,将r[1]到r[n]看成是一个
完全二叉树顺序存储结构,利用完全二叉 树中双亲结点和孩子结点之间的内在关系 来选择最小或最大元素。
i =4
38 49 65 76 97 13 27 49
i =5
13 38 49 65 76 97 27 49
排序过程:先将序列中第 1 个记录看成是一个有序子序列,
i =6
13 27 38 49 65 76 97 49
然后从i =第72 个记录13开始27,逐3个8 进4行9插入49,直65至整7个6序列97有序。
最新课件-数据结构教学第9章排序 精品

假设含有n个记录的序列为{R1, R2, …, Rn }, 其相应的关键 字序列为{K1, K2, …, Kn }, 所谓排序就是将记录按关键字非递
减(或非递增)的顺序重新排列起来。
在待排序的记录中若有多个相同的关键字, 在用某种方法排 序之后, 这些关键字相同的记录相对先后次序不变, 则称这种排 序方法是稳定的 ; 否则是不稳定的。本章所介绍的内部排序方 法包括插入排序、交换排序、选择排序、归并排序和基数排序。 前四类排序是通过比较关键字的大小决定记录先后次序,也称为 比较排序。 基数排序是不经关键字比较的排序方法。 为了讨论方便, 在此把排序关键字假设为整型。 记录的结
第9章 排序
9.1 排序基本概念 9.2 插入排序 9.3 交换排序 9.4 选择排序
9.5 归并排序
9.6 基数排序 9.7 内部排序总结 9.8 有关排序算法的C语言源程序 9.9 多路归并用于外排序的简介
返回主目录
第9章排序
9.1 排序基本概念
排序(sorting)又称分类, 意指把一批杂乱无章的数据序列 重新排列成有序序列。按待排序的记录的数量多少, 排序过程 中涉及的存储介质不同, 排序方法分为两大类: 内部排序和外部 排序。内部排序是指待排序的记录存放在计算机内存之中 ; 外 部排序是指待排序的记录数量很大, 以至于内存容纳不下而存 放在外存储器之中, 排序过程需要访问外存。 排序的依据可以是记录的主关键字, 也可以是次关键字, 甚 至是若干数据项的组合。 为了讨论方便, 把排序所依据的数据 项统称排序关键字, 简称关键字。
9.2.2 折半插入排序
当直接插入排序进行到某一趟时, 对于r[i].key来讲, 前面 i-1个记录已经按关键字有序。 此时不用直接插入排序的方法 , 而改为折半查找 , 找出 r [i].key应插的位置, 然后插入。 这种方法就是折半插入排序 (binary insertion sort)。算法如下: 算法 9.2 void binasort(struct node r[MAXSIZE], int n)
数据结构PPT课件精品 第9章 排序2(ppt文档)

合理地选择基准记录,使得每次分划所得两个子 文件的记录数尽可能接近,可以加快排序速度。
i=2 70 68 69 23 93 18
i=3 i=4 i=5 70 68 69 23 9131 18
i=5 70 68 69 23 11 18
j=6
11
11
11
1913 j=7 93 i=7
68 100 j=9
73 100 j=8 73 100 j=8 73 100
73 100
[18 68 69 23 11] 70 [93 73] 100
[93 73]
[73] 93
j=8
73
93
73
93
73 93]
算法QSort(R,m,n)
IF m < n THEN
( i←m . j←n+1 . K←Km . QSort1;//一次分划程序段 QSort ( R,m,j–1 ) .
L1: QSort ( R,j+1,n ) . L2: ) ▌
[18 68
WHILE Ki<K DO i←i+1 . j←j–1 .
WHILE Kj >K DO j←j–1 .
快速排序一次
IF i<j THEN Ri Rj .)
分划过程示例:
RmRj .
(1) (2) (3) (4) (5) (6) (7) (8) (9)
70 73 69 23 93 18
i=1 70 68 69 23 93 18
[11] 18 j=2
11 18
九章排序

16
0
1
4
5
temp
i=4 j=1
21 0
25 1
16 25*
2
25* 3
49 08 4 5
16
i=4 j=0
21 0
16
25 1
25 2
25* 3
49 08 4 5
16 temp
i=4 j = -1
16 21 0
21
25
25*
49 08
16
1
2
3
4
5
temp
直接插入排序的算法
template <class Type> void dataList <Type> :: InsertSort ( ) { //按排序码 Key 非递减顺序对表进行排序 Element<Type> temp; int i, j; for ( i = 1; i < CurrentSize; i++ ) { if ( Vector[i] < Vector[i-1] ) { temp = Vector[i]; for ( j = i; j > 0; j-- ) //从后向前顺序比较 if ( temp < Vector[j-1] ) Vector[j] = Vector[j-1]; else break;
KCN i n(n 1) / 2 n 2 / 2, RMN (i 2) (n 4)(n 1) / 2 n 2 / 2
i 1 i 1 n 1 n 1
平均情况下排序的时间复杂度为 O(n2)。 直接插入排序是一种稳定的排序方法。
2.折半插入排序 (Binary Insertsort)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16
9.2.3 希尔插入排序 希尔插入排序:对有n个记录进行排序,首先取1 个整数d<n,将这n个记录分成d组,所有位臵相差为d 的倍数的记录分在同一组,在每组中使用直接插入排 序进行组内排序,然后缩小d的值,重复进行分组和组 内排序,一直到d=1结束。
排序过程:先取一个正整数d1<n,把所有相 隔d1的记录放一组,组内进行直接插入排序;然 后取d2<d1,重复上述分组和排序操作;直至 di=1,即所有记录放进一个组中排序为止
}
19
希尔排序特点
子序列的构成不是简单的“逐段分割”,
而是将相隔某个增量的记录组成一个子序 列 希尔排序可提高排序速度,因为 分组后n值减小,n² 更小,而T(n)=O(n² ), 所以T(n)从总体上看是减小了 关键字较小的记录跳跃式前移,在进行 最后一趟增量为1的插入排序时,序列已 基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1 20
内排序是指在排序过程中所有数据均放在内存中 处理,不需要使用外存的排序方法。而对于数据量很 大的文件,在内存不足的情况下,则还需要使用外存, 这种排序方法称为外排序。 3
排序码相同的记录,若经过排序后,这些记录 仍保持原来的相对次序不变,称这个排序算法是稳 定的。否则,称为不稳定的排序算法。
49 38 65 97 76 13 49 27
第9章 排序
9.1 概述 9.2 插入排序 9.2.1 直接插入排序 9.2.2 二分插入排序 9.2.3 希尔插入排序 9.3 交换排序 9.3.1 冒泡排序 9.3.2 快速排序 9.4 选择排序 9.4.1 简单选择排序 9.4.2 堆排序 9.5 归并排序
第9章 排序
排序是数据处理过程中经常使用的一种重要的运 算,排序的方法有很多种,本章主要讨论内排序的各 种算法,并对每个排序算法的时间和空间复杂性以及 算法的稳定性等进行了讨论。
15
折半插入的算法分析:
从上面算法可以看出: 折半插入排序所需附加存储空间和直接插入排序相 同,从时间上比较,折半插入排序仅减少了关键字间 的比较资料,而记录的移动次数不变,因此折半插入 排序的时间复杂度仍为 O(n² )
算法评价
时间复杂度:T(n)=O(n² ) 空间复杂度:S(n)=O(1)
8
直接插入排序过程示例
0
监视哨
1 34 12 12 12
2 12 34 34 28
3 49 49 49 34
4 28 28 28 49
5 31 31 31 31
6 52 52 52 52
7 8 初始关键字序列 51 49* 51 49* 51 49* 51 49*
i=2 i=3 i=4 i=5 i=6 i=7 i=8
13 30 39 42 mid 13 30 39 42 h m 13 30 39 42 l mh 13 30 39 42 h l 13 20 30 39
70 85 ) 20
42 70 85 )
14
折半插入算法:
void BinaryInsertSort(SqList *S) { int low,mid,high; for(i=2;i<=S->length;i++) { S->r[0].key=S->r[i].key; //保存待插入的元素 low=1;high=i-1; //设臵查找范围的左、右位臵值 while(low<=high) //查找第i个元素的插入位臵 { mid=(low+high)/2; //取中点位臵 if(S->r[0].key>S->r[mid].key) low=mid+1; else high=mid-1; } // while for(j=i-1;j>=high+1;j--) S->r[j+1].key=S->r[j].key; //后移,空出插入位臵 S->r[high+1].key=S->r[0].key; //插入第i个元素的副本 } //for } //BinaryInsertSort
2 3 4 04 49* 38 2 13 3 27
5 27
6 49
7 55 7 55
8 65 8 65
9 10 97 76
9 10 76 97
增量d=1
4 5 6 38 49* 49
18
void ShellInsert(SqList *s,int gap) { /*一趟增量为gap的插入排序,gap为步长*/ int i,j; for(i=gap+1;i<=S->length;i++) if(S->r[i].key<S->r[i-gap].key) { //小于时需将r[i]插入有序表 S->r[0]=S->r[i]; /*为统一算法设臵监视哨*/ for(j=i-gap;j>0 && S->r[0].key<S->r[j].key;j=j-gap) S->r[j+gap]=S->r[j]; /*记录后移*/ S->r[j+gap]=S->r[0]; /*插入到正确位臵*/ } /* if */ } void ShellSort(SqList *s,int gaps[],int t) { //按增量序列gaps[0,1…,t-1] 作希尔排序 int k; for(k=0;k<t;t++) ShellInsert(S,gaps[k]); /*一趟增量为gaps[k]的插入排序*/
i=2: (126)
i=3: (272)
i=4: (226) i=5: (28) i=6: (165) i=7: (123)
[123,272,312],226,28,165,123
[123,226,272,312],28,165,123 [28,123,226,272,312],165,123 [28,123,165,226,272,312],123 [28,123,123,165,226,272,312]
n 1
n 1
若待排序记录是随机的,取平均值
n2 (i 1) i 1 2
n2 关键字比较次数: n2 4 记录移动次数: 4
T(n)=O(n² )
空间复杂度:S(n)=O(1)
12
9.2.2 二分法插入排序 二分法插入排序的思想:
根据插入排序的基本思想,在找第i个记录的插入 位臵时,前i-l个记录已排序,将第i个记录的排序码 key[i]和已排序的前i-1个的中间位臵记录的排序码进行 比较,如果key[i]小于中间位臵记录排序码,则可以在 前半部继续使用二分法查找,否则在后半部继续使用 二分法查找,直到查找范围为空,即可确定key[i]的插 入位臵。
9.3交换排序
交换排序的基本思路: 对待排序记录两两进行排序码比较,若不满足排 序顺序则交换这对记录,直到任何两个记录的排序码 都满足排序要求为止。
有序序列区 无序序列区
通过交换选出一个最小或最 大的记录,加入有序集合
有序序列区
无序序列区
9.3.1 冒泡排序
21
起泡排序(Bubble Sorting)的基本思想是:不停地 将相邻位臵的关键字进行比较,若为逆序则交换之, 直到所有记录都已经排好序为止。 第1趟,对所有记录从左到右每相邻两个记录的排序 码进行比较,如果这两个记录的排序码不符合排序要 求,则进行交换,这样一趟做完,将排序码最大者放 在最后一个位臵; 第2趟对剩下的n-l个待排序记录重复上述过程,又 将一个排序码放于最终位臵,反复进行n-l次,可将n-l 个排序码对应的记录放至最终位臵,剩下的即为排序 码最小的记录,它在第1的位臵处。 如果在某一趟中,没有发生交换,则说明此时所 有记录已经按排序要求排列完毕,排序结束。
13 27 38 49 49 65 76 97 13 27 38 49 49 65 76 97
稳定的 不稳定的
4
有序序列区
无序序列区
一趟排序
有序序列区
按排序依据原则
无序序列区
插入排序:直接插入、折半插入、希尔排序
交换排序:冒泡排序、快速排序
选择排序:简单选择排序、堆排序
归并排序:2-路归并排序
10
设待排序的 7 记录的排序码为 {312 , 126, 272 , 226 ,28, 165 , 123},直接插入排序算法的执行过程: 哨兵 排序码 [] 312,123,272,226,28,165,123 初始 () [312],123,272,226,28,165,123 [123,312],272,226,28,165,123
13
例
i=1
(30) 13 70 85 39 42 6 30) 70 85 39 42 6
20 20
i=2 13 (13
i=7 6
i=8 20 (6 low i=8 20 (6 l i=8 20 (6
i=8 20 (6
i=8 20 (6
…...
(6
13 30 39
42 70 85 ) 20
70 85 ) 20 high 70 85 ) 20 70 85 ) 20
7
9.2 插入排序
插入排序的基本方法是: 将待排序文件中的记录, 逐个地按其排序码值的 大小插入到目前已经排好序的若干个记录组成的文件中 的适当位臵,并保持新文件有序。
9.2.1 直接插入排序
排序过程:整个排序过程为n-1趟插入,即先将序列中 第1个记录看成是一个有序子序列,然后从第2个记 录开始,逐个进行插入,直至整个序列有序
12 49 28
31
52 51
12