精选第十章排序资料

合集下载

数据结构答案 第10章 排序学习与指导

数据结构答案 第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-严蔚敏)

第十章_排序方法(数据结构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个元素 的次小值;重复执行,得到一个有序序列,这个过程 叫~ 堆排序需解决的两个问题:
如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新 的堆?
按排序所需工作量

第十章1.排序

第十章1.排序
13 30 39 mj 13 30 39
s mj
42 70 42 70 42 70
85 ) 20 j 85 ) 20
85 ) 20
13 30 39 42 70 85 ) 20 js
13 20 30 39 42 70 85 )
❖算法评价
时间复杂度:T(n)=O(n²) 空间复杂度:S(n)=O(1)
例 i=1
(30) 13 70 85 39 42 6 20
i=2 13 (13 30) 70 85 39 42 6 20
…...
i=7 6 (6 i=8 20 (6
s i=8 20 (6
s i=8 20 (6
i=8 20 (6
i=8 20 (6
13 30 39 42 70 85 ) 20
13 30 39 m
例 38
13
49
13 3287
13 4297 380 76 13 6257 4390 38 9173 7267 6350 49 927 7360 65
9370 76
97 初第第第第第第 始一二三四五六 关趟趟趟趟趟趟 键 字
❖算法评价
时间复杂度
最好情况(正序)
比较次数:n-1
移动次数:0
最坏情况(逆序)
❖按排序所需工作量
简单的排序方法:T(n)=O(n²) 先进的排序方法:T(n)=O(logn) 基数排序:T(n)=O(d.n)
排序基本操作
❖比较两个关键字大小 ❖将记录从一个位置移动到另一个位置
§10.1 插入排序
直接插入排序
❖排序过程:整个排序过程为n-1趟插入,即先将序列 中第1个记录看成是一个有序子序列,然后从第2个记 录开始,逐个进行插入,直至整个序列有序

数据结构第十章排序严蔚敏.ppt

数据结构第十章排序严蔚敏.ppt
对于有相同关键字记录的情况,冒泡排 序是稳定的。
第十章 排序
10.2.3 直接插入排序
直接插入排序的基本思想是:从数组的 第二个单元开始,依次从原始数据中取 出数据,并将其插入到数组中该单元之 前的已排好序的序列中合适的位置处。
直接插入算法需要经过(n-1)趟插入过 程。如果数据恰好应插入到序列的最后 端,则不需移动数据,可节省时间,所 以若原始数据大体有序,此算法可以有 较快的运算速度。
排 28
14
14 28
17 15
20 17
42 20
︹ 42
23 ︹
23 28
序 23 15 28 23 23 23 42 ︹
过 15 23 23 28 28 28 28 42
程︺ ︺ ︺ ︺ ︺ ︺ ︺ ︺
第十章 排序
需扫描的趟数视原始数据最初的排列次 序的不同而不同,最坏的情况要进行 (n-1)趟扫描,一般常常少于(n-1)趟即 可完成。
第十章 排序
简单插入排序算法
void insertsort (sqlist r, int n) {
int i,j; for( i=2; i<=n; i++) {
r[0]=r[i]; /* r[0]用于暂时存放待插入的元素*/ j= i-1; /* j为待比较元素下标,初始时指 向待插入元素前一个单元*/
第十章 排序
10.3.2 构建堆
一般构建堆是采用一种称为筛选(sift)的算 法。这种方法是将一个无序数据序列的构建 堆的过程看作一个反复“筛选”的过程。
设原始数据为10,10,13,15,4,20,19, 8(数据个数n=8)。
首先把这些数据按任意次序置入完全二叉树 的各结点中,由于原始数据的次序是任意的, 此树一般不符合堆的条件,需要用筛选运算 进行调整。

(完整版)第10章排序练习题答案

(完整版)第10章排序练习题答案

第10章排序练习题答案一、填空题1. 大多数排序算法都有两个基本的操作:—比较 _________________ 和—移动___________________ 。

2. 在对一组记录(54, 38,96, 23,15,72, 60,45, 83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较_3 ______ 次。

3. 在插入和选择排序中,若初始数据基本正序,则选用—插入_____________ ;若初始数据基本反序,则选用选择______ 。

正序时两种方法移动次数均为0,但比较次数量级不同,插入法:n-1即0(n),选择法:0(n2)反序时两种方法比较次数量级相同,均为0(n2),但移动次数不同,插入法:0(n2),选择法:3(n-1)即O(n)4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用—堆排序________________ ;若初始记录基本无序,则最好选用_快速排序________ 。

5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是_O(n2) ______ 。

若对其进行快速排序,在最坏的情况下所需要的时间是_O(n2) ___________ 。

6. 对于n个记录的集合进行归并排序,所需要的平均时间是_O(nlog2n) ___________ ,所需要的附加空间是_ O(n) _____ 。

7. 对于n个记录的表进行2路归并排序,整个归并排序需进行_厂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 _;二路归并排序一趟扫描的结果是_H QCYAP MS DRFX ;快速排序一趟扫描的结果是_F H C D P A M Q R S Y X _;堆排序初始建堆的结果是_Y S X R P C M H Q D F A _。

(完整版)第十章排序

(完整版)第十章排序
辅助手段:多媒体演示。
作业布置
10-2,10-3,10-4
主要
参考资料
1.《数据结构》,严蔚敏 吴伟民,清华大学出版社;2.数据结构题集(C语言版),严蔚敏 吴伟民,清华大学出版社;
备注
数据结构教案
第 2 次课 学时4
章节
10.3、快速排序10.4选择排序
讲授主要内容
堆排序、交换排序(冒泡排序)的基本思想,算法实现,算法性能分析
要求掌握知识点和分析方法
归并排序 ,基数排序
教授思路,采用的教学方法和 辅助手段,板书设计,重点如何突出,难点如何解决,师生互动等
教授过程与思路:1。归并排序的思想---〉算法实现---〉程序演示----〉性能分析;2。基数排序的概念,要借助队列来实现,不同的存储结构,不同的实现方法,不同的算法性能。3。本章小结:各种排序算法的性能比较
主要辅助手段:多媒体
作业布置
10-4(2),(4),(5),10-6,
主要
参考资料
1.《数据结构》,严蔚敏 吴伟民,清华大学出版社;2.数据结构题集(C语言版),严蔚敏 吴伟民,清华大学出版社;
备注
数据结构教案
学时:8学时
章节
第十章 排序
知识点和分析方法
排序算法的性能指标,插入排序、选择排序、交换排序、归并排序、基数排序的算法设计与应用
重点
难点
教学重点:希尔排序、堆排序、快速排序、二路归并排序和基数排序的算法思想
教学难点:堆排序、快速排序、二路归并排序和基数排序的算法设计方法
要求掌握内容
掌握排序的基本概念和排序算法的评判标准;掌握直接插入排序、希尔排序、直接选择排序、堆排序、快速排序、二路归并排序、基数排序的算法思想

数据结构第十章 排序

数据结构第十章 排序
7
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].

第十章排序

第十章排序

二分判定有序表插入位置方法:
① low=1;high=j-1;r[0]=r[j]; // 有序表长度为j1,第j个记录为待插入记录
//设置有序表区间,待插入记录送辅助单元
② 若low>high,得到插入位置,转⑤
③ low≤high,m=(low+high)/2; // 取表的中点, 并将表一分为二,确定待插入区间*/
【效率分析】
空间效率:仅用了一个辅助单元。
时间效率:向有序表中逐个插入记录的操作, 进行了n-1趟,每趟操作分为比较关键码和移动记录, 而比较的次数和移动记录的次数取决于待排序列按 关键码的初始排列。
最好情况下:即待排序列已按关键码有序,每 趟操作只需1次比较2次移动。
总比较次数=n-1次 总移动次数=2(n-1)次 最坏情况下:即第j趟操作,插入记录需要同前 面的j个记录进行j次关键码比较,移动记录的次数为 j+2次。
10.2.3表插入排序
直接插入排序、折半插入排序均要大量移动记 录,时间开销大。若要不移动记录完成排序,需要 改变存储结构,进行表插入排序。所谓表插入排序, 就是通过链接指针,按关键码的大小,实现从小到 大的链接过程,为此需增设一个指针项。操作方法 与直接插入排序类似,所不同的是直接插入排序要 移动记录,而表插入排序是修改链接指针。用静态 链表来说明。
i=2 2 0 1 - - - - - - next域
49 MAXINT 38 65 97 76 13 27 49 key域
i=3 2 3 1 0 - - - - - next域
49 MAXINT 38 65 97 76 13 27 49 key域
i=4 2 3 1 4 0 - - - - next域
④ 若r[0].key<r[m].key,high=m-1; //插入位置在 低半区

第十章排序1

第十章排序1
【13】, 6, 3, 31, 9, 27, 5, 11 【6, 13】, 3, 31, 9, 27, 5, 11 【3, 6, 13】, 31, 9, 27, 5, 11 【3, 6, 13,31】, 9, 27, 5, 11 【3, 6, 9, 13,31】, 27, 5, 11 【3, 6, 9, 13,27, 31】, 5, 11 【3, 5, 6, 9, 13,27, 31】, 11 【3, 5, 6, 9, 11,13,27, 31】
R[i]
插入排序有多种具体实现算法:
1) 直接插入排序 2) 折半插入排序
有序序列R[1..i] 无序序列 R[i+1..n]
Data Structure
1) 直接插入排序
最简单的排序法!
新元素插入到哪里?
在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元 素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11), 请写出直接插入排序的中间过程序列。
//定义每个记录(数据元素)的结构
KeyType key ;
//关键字
InfoType otherinfo; //其它数据项
}RedType ;
Typedef struct {
//定义顺序表的结构
RedType r [ MAXSIZE +1 ]; //存储顺序表的向量
//r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
2459*
214569*
49 08
0 123456
i=1 i=2 i=3 i=4 i=5 i=6
Data Structure
算法 10.1
void InsertSort (SqList&L) { //对顺序表L作直接插入排序。

数据结构第10章排序-128页文档资料

数据结构第10章排序-128页文档资料
∥插入R[i],使R[1..i]中的记录按关键字非递减有序排列 R[0]=R[i]; j=i-1; ∥将待排序记录放进监视哨 x=R[0].key; ∥从后向前查找插入位置,将大于待排序记录向后移动 while (x< R[j].key) { R[j+1]=R[j]; j--; } ∥记录后移 R[j+1]=R[0]; ∥将待排序记录放到合适位置
{j=0;

for(k=SL[0].next; SL[k].key<=SL[i].key; )

{j=k, k=SL[k].next; }

SL[j].next=i; SL[i].next=k;

∥结点i插入在结点j和结点k之间

}∥for
}∥ListInsSort
2019/11/29
23
23

else { low=first;high=n;

while (low<=high)

{ m=(low+high)/2;

if(R[i].key< d[m].key) high=m-1;

else low=m+1;

}∥while

for (j=first;j<=high;j++) d[j-1] = d[j];
12
12
直接插入排序性能分析
最好情况
比较次数为n-1次 移动次数为2(n-1)次
最坏情况
比较次数为
n

i
=(n+2)(n-1)/2
i 2
移动次数为
n
(i 1 2)
=(n+4)(n-1)/2

第10章 排序

第10章 排序
直接插入排序的时间效率越高,其时间效率在 O(n) ~O(n2)之间。
14
二、希尔(shell)排序 (又称缩小增量排序)
1.基本思想:把整个待排序的数据元素分成若干个小组,对同一小组内 的数据元素用直接插入法排序;小组的个数逐次缩小,当完成了所 有数据元素都在一个组内的排序后排序过程结束。
2.技巧:小组的构成不是简单地“逐段分割”,而是将相隔某个增量dk
dk=1
17
例3.希尔排序的排序过程
65 34 25 87 12 38 56 46 14 77 92 23
结果序列d=6 56
34
14
77
12
23
65
46
25
87
92
38
(a)
56 34 14 77 12 23 65 46 25 87 92 38
结果序列d=3 56
12
14
65
34
23 (b)
77
第10章 排序
10.1 10.2 10.3 10.4 10.5 10.6 10.7 排序的基本概念 插入排序 选择排序 交换排序 归并排序 基数排序 性能比较
1
10.1 排序的基本概念
1.排序:将一组杂乱无章的数据(存放在数据表中)按一定 的规律(按关键字排序)顺次排列起来的过程。 2.关键字是要排序的数据元素集合中的一个域(数据项), 排序是以关键字为基准进行的。 3.主关键字:数据元素值不同时该关键字的值也一定不同, 是能够惟一区分各个不同数据元素的关键字;不满足主关 键字定义的关键字称为次关键字。
第一趟结束,找到最小值 2,a[1]和a[5]的元素进行交换
第二趟比较 :
a[1] a[2]
a[3]

第10章 排序

第10章 排序

先讨论第2个问题 先讨论第 个问题
第二个问题:输出堆顶元素之后,如 何调整剩余的元素成为一个新堆
堆调整的过程:假设待调整的树根下标为i, 那么 1. 如果a[i]已经是a[i]和其左右孩子中的最大 结点,那么这个结点a[i]已经是最大堆了 2. 否则交换a[i]和左右子树中最大的值。 3. 同样的方法调整和a[i]交换的子树,直到其 成为最大堆为止。
比较次数 = ∑ (i + 1) = (n − 1)(n + 1) / 2
i =1 n −1
移动次数 = ∑ (i + 2) = (n − 1)(n + 4) / 2
i =1
n −1
III.
原始数据序列顺序是随机的, 原始数据序列顺序是随机的,那么期望的移动次数为 n2/4,期望时间复杂度为:O(n2) 期望时间复杂度为: 期望时间复杂度为
直接选择排序
初始序列: 64 第1趟: [5] 第2趟: [5 第3趟: [5 第4趟: [5 第5趟: [5 最终结果: [5
5 64 6] 6 6 6
6
7 7 7 7] 7 7
7
89 89 89 89 24] 24
24
6 6 64 64 64 64]
64
24 24 24 24 89 89
89]
起泡排序的基本方法是: 起泡排序的基本方法是:设待排序对象 序列中的对象个数为 n。最多作 n-1 趟,i = 。 1, 2, …, n-2 。在第 i 趟中顺次两两比较 趟中顺次两两比较 比较v[nj-1].Key和v[n-j].Key,j = n-1, n-2, …, i。若 和 , 。 为逆序即v[n -j-1]>v[n-j] ,则交换 则交换v[n -j-1] 为逆序即 这样做完一趟操作, 和v[n-j],这样做完一趟操作,最大的数将被 - 这样做完一趟操作 放在数组的末尾。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插入位j置=i-1
0 1 2 3 45 6 7 8
12 27 38 49 52 65 76 97 22
void InsertionSort ( SqList &L ) { // 对顺序表 L 作直接插入排序。
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
无序序列 R[i..n]
R[i]
有序序列R[1..i]
无序序列 R[i+1..n]
15
实现“一趟插入排序”可分三步进行:
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]中的所有记录均后移
L.r[0] = L.r[i];
// 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移
L.r[j+1] = L.r[0]; // 插入到正确位置 }
} // InsertSort
23
内部排序的时间分析:
一个位置;
3.将R[i] 插入(复制)到R[j+1]的位置上。
16
不同的具体实现方法导致不同的算法描述
直接插入排序(基于顺序查找) 折半插入排序(基于折半查找) 表插入排序(基于链表存储) 希尔排序(基于逐趟缩小增量)
17
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位置”
for (j=i-1; R[0].key<R[j].key; --j); R[j+1] = R[j]
R[0]
R[i]
j 插入j=位i置-1 上述循环结束后可以直接进行“插入”20
令 i = 2,3,…, n, 实现整个序列的排序。
for ( i=2; i<=n; ++i ) if (R[i].key<R[i-1].key) { 在 R[1..i-1]中查找R[i]的插入位置; 插入R[i] ; }
6
三、内部排序的方法
内部排序的过程是一个逐步扩大 记录的有序序列长度的过程。
有序序列区 无 序 序 列 区
ki
经过一趟排序
有序序列区 无 序 序 列 区
7
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
插入类 交换类
选择类
归并类
8
#待de排fin记e M录A的XS数IZ据E 类10型00定// 待义排如顺下序:表最大长度
21
例如
0 1 2 3 45 6 7 8
49 38 65 97 76 13 27 52
j j=i插-1入位置 插入38
0 1 2 3 45 6 7 8
38 49 65 97 76 13 27 52
j=i-1 插入65
0 1 2 3 45 6 7 8
12 27 38 49 65 76 97 52
插入52 j
实现内部排序的基本操作有两个:
(1)“比较”序列中两个关键字的 大小;
(2)“移动”记录。
24
对于直接插入排序:
最好的情况(关键字在记录序列中顺序有序):
“比较”的次数: “移动”的次数:
n
1 n 1
0
i2
最坏的情况(关键字在记录序列中逆序有序):
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key;
// 关键字项
InfoType otherinfo; // 其它数据项
} RcdType;
// 记录类型
typedef struct {
RcdType r[MAXSIZE+1]; // r[0]闲置
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97 4
一般情况下, 假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn }
算法的实现要点:
18
从ห้องสมุดไป่ตู้[i-1]起向前进行顺序查找,
监视哨设置在R[0];
R[0]
R[i]
j R[0] = R[i];
插入j=位i-置1
// 设置“哨兵”
for (j=i-1; R[0].key<R[j].key; --j); // 从后往前找
循环结束表明R[i]的插入位置为 j +119
对于在查找过程中找到的那些关键 字不小于R[i].key的记录,并在查找的 同时实现记录向后移动;
第十章 排序
1
10.1 概述 10.2 插入排序 10.3 快速排序 10.4 堆排序(略) 10.5 归并排序(略) 10.6 基数排序(略) 10.7 各种排序方法的综合比较
2
10.1 概 述
一、排序的定义 二、内部排序和外部排序 三、内部排序方法的分类
3
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
11
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它 加入到有序子序列中,以此方法增 加记录的有序子序列的长度。
12
4. 归并类
通过“归并”两个或两个以上的 记录有序子序列,逐步增加记录有 序序列的长度。
13
10. 2 插入排序
14
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
int
length;
// 顺序表长度
} SqList;
// 顺序表类型 9
1. 插入类
将无序子序列中的一个或几 个记录“插入”到有序序列中, 从而增加记录的有序子序列的长 度。
10
2. 交换类
通过“交换”无序序列中的记 录从而得到其中关键字最小或最大 的记录,并将它加入到有序子序列 中,以此方法增加记录的有序子序 列的长度。
这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :
Kp1≤Kp2≤…≤Kpn 按此固有关系将上式记录序列重新排列为
{ Rp1, Rp2, …,Rpn } 的操作称作排序。
5
二、内部排序和外部排序
若整个排序过程不需要访问外存便 能完成,则称此类排序问题为内部排 序;
反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题为外部排序。
相关文档
最新文档