第十章 排序

合集下载

数据结构-第十章-内部排序

数据结构-第十章-内部排序

0
1
2
3
4
5
6
7
8
i=5
MAXINT 49 2 3
MAXINT 49 6 3 MAXINT 49 6 3 MAXINT 49 6 8
38 1
38 1 38 1 38 1
65 97 5 0
65 5 65 5 65 5 97 0 97 0 97 0
76 4
76 4 76 4 76 4
13
27
49
i=6



最坏情况下,待排记录按关键字非递增有序 排列(逆序)时,第 i 趟时第 i+1 个对象 必须与前面 i 个对象都做排序码比较, 并且 每做1次比较就要做1次数据移动。总比较 次 数 为 (n+2)(n-1)/2 次 , 总 移 动 次 数 为 (n+4)(n-1)/2。 在平均情况下的排序码比较次数和对象移 动次数约为 n2/4。因此,直接插入排序的 时间复杂度为 O(n2)。 直接插入排序是一种稳定的排序方法。
折半插入排序 (Binary Insertsort)
基本思想 既然每个要插入记录之前的纪录 已经按关键字有序排列,在查找插入位 臵时就没有必要逐个关键字比较,可以 使用折半查找来实现。由此进行的插入 排序称之为折半插入排序。
折半插入排序的算法
void BInsertSort (SqList &L){ for (i=2;i<=L.length;++i){ L.r[0]=L.r[i]; low=1;high=i-1; //查找范围由1到i-1 while(low<=high){ m=(low+high)/2; if LT(L.r[0].key,L.r[m].key) high=m-1; else low=m+1; }//while 折半查找 for (j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; //折半查找结束后high+1位臵即为插入位臵 L.r[high+1]=L.r[0]; }//for }//BInsertSort

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

数据结构(严蔚敏)第10章

数据结构(严蔚敏)第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
【学习目标】

第十章排序

第十章排序
第一趟:第1个与第2个比较,大则交换;第2个与第3个比较, 大则交换,……关键字最大的记录交换到最后一个位置上; 第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换 到第n-1个位置上;
依次类推,则完成排序。
正序:时间复杂度为O(n) 逆序:时间复杂度为O(n2)
适合于数据较少的情况。
2013-5-13 排序n个记录的文件最多需要n-1趟冒泡排序。 举例:图8-2-5
25
思想:小的 浮起,大的 沉底。
25 56 49 78 11 65 41 36
初 始 关 键 字
25 49 56 11 65 41 36 78
第 一 趟 排 序 后
25 49 11 56 41 36 65
25 11 49 41 36 56
11 25 41 36 49
11 25 36 41
11 25 36
简单选择排序、堆排序。
1、简单选择排序
思想:首先从1~n个元素中选 出关键字最小的记录交换到第 一个位置上。然后再从第2 个 到第n个元素中选出次小的记 录交换到第二个位置上,依次 类推。
时间复杂度为O(n2), 适用于待排序元素较少的情况。
3 j 3 k 3 k 3
互换
9 9 j 9 9
1 1 1 j 1 k 8
插入算法如下:
9
方法:Ki与Ki-1,K i-2,…K1依次比较,直到找到应插入的位置。 void insertSort(RedType L[ ],int n)
{ int i ,j; for(i=2; i<=n; i++) if(L[i].key<L[i-1].key)
{
L[0]=L[i];
L[j+1]=L[j]; L[j+1]=L[0];

第十章排序(可编辑修改word版)

第十章排序(可编辑修改word版)
主要辅助手段:多媒体
作业布置
10-4(2),(4),(5),10-6,
主 要 参考资料
1.《数据结构》,严蔚敏 吴伟民,清华大学出版社;2.数据结构题集(C语言版),
严蔚敏 吴伟民,清华大学出版社;
备注
重点难点
希尔的思想,实现,算法分析
要求掌握知识点和
分析方法
1.概念:排序,主(次)关键字,内部(外部)排序,比较排序算法的技术指标2。插入排序的基本思想;3。直接直接插入排序和希尔的思想,实现,算法分析。
教授思路,采 用 的 教学方法和辅助手段,板书设计,重 点 如 何突出,难点如何解决,师 生 互 动等
难点:堆的调整辅助手段:多媒体
作业布置
10-7,10-8
主 要 参考资料
1.《数据结构》,严蔚敏 吴伟民,清华大学出版社;2.数据结构题集(C语言版),
严蔚敏 吴伟民,清华大学出版社;
备注
章节
10.5归并排序10.6基数排序
讲授主要内容
归并排序 ,基数排序
重点难点
归并排序 ,基数排序的基本思想与算法实现
本章思考题和习题
主 要 参考资料
1.《数据结构》,严蔚敏 吴伟民,清华大学出版社;2.数据结构题集(C语言版),
严蔚敏 吴伟民,清华大学出版社;
备注
章节
10.1概念10.2插入排序
讲授主要内容
1.概念:排序,主(次)关键字,内部(外部)排序,比较排序算法的技术指标2.
插入排序的基本思想;3。直接直接插入排序和希尔的思想,实现,算法分析。
教授思路,采 用 的 教学方法和辅助手段, 板书设计,重 点 如 何突出,难点如何解决,师 生 互 动等
教学思路:

数据结构考研试题精选及答案第10章排序

数据结构考研试题精选及答案第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.冒.冒泡排序)。

第十章 排序

第十章 排序
i=2: (38) (38 49) 65 97 76 13 27 49 i=3: (65) (38 49 65) 97 76 13 27 49 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
2)再取 d2 < d1,把所有相隔 d2 的记录放一组,对每一组内的记录进 行直接插入排序。
3)最后取 di=1,即把所有记录放 在一组进行直接插入排序排序。 15
例1.3
对下列关键字进行希尔排序: 49 38 65 97 76 13 27 48 55 4 取 d1=5,d2=3,d3=1。
16
lmh 13 30 39 42 70 85 ) 20
hl 13 20 30 39 42 70 85 )
13
折半插入算法的分析
• 时间复杂度为O(n2)。 • 空间复杂度为S(n)=O(1),即使用
一个辅助单元(第0个单元)。
14
1.3 希尔排序
基本思想:
1)先取一个正整数d1(d1<记录数 n),把所有相隔d1的记录放一组, 这样就把整个待排记录序列分割成若 干个子序列,对每个子序列进行直接 插入排序。
13 4 48 38 27
49 55 65 97 76
取d3=1 三趟分组: 13 4 48 38 27 49 55 65 97 76
三趟排 序结果:
4 13 27 38 48 49 55 65 76 97
18
希尔排序的特点
• 子序列的构成不是简单的“逐段分 割”,而是将相隔某个增量的记录组 成一个子序列

数据结构第10章排序练习及答案

数据结构第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,不符合大根堆特点。

数据结构第十章排序严蔚敏.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章排序.ppt

第10章排序.ppt
(2)空间效率:仅占用1个附加内存单元——O(1) (3)算法的稳定性:稳定
精选精选文档
6
初始关键字序列:
{64}
5
7
89
第一次排序:
{5
64}
7
89
第二次排序:
{5
7
64}
89
第三次排序:
{5
7
64
89}
第四次排序:
{5
6
7
64
第五次排序:
{5
6
7
24
直接插入排序过程
精选精选文档
6
24
6
24
6
24
//设第i个数据元素关键字最小
for(j = i+1; j < n; j++)
//寻找关键字最小的数据元素
if(a[j].key < a[small].key) small=j;
//记住最小元素的下标
if(small != i)
//当最小元素的下标不为i时交换位置
{
temp = a[i];
a[i] = a[small];
for(m = 0; m < numOfD; m++)
//共numOfD次循环
{ span = d[m];
//取本次的增量值
for(k = 0; k < span; k++)
//共span个小组
{
//组内是直接插入排序,区别是每次不是增1而是增span
for(i = k; i < n-span; i = i+span)
CreatHeap(a, i, 0);
//调整根结点满足最大堆

第10章排序答案

第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;堆排序初始建堆的结果是A, D, C, R, F, Q, M, S, Y,P, H, X。

9. 在堆排序、快速排序和归并排序中,若只从存储空间考虑,则应首先选取堆排序方法,其次选取快速排序方法,最后选取归并排序方法;若只从排序结果的稳定性考虑,则应选取归并排序方法;若只从平均情况下最快考虑,则应选取快速排序方法;若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。

数据结构第十章 排序

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

第10章 排序(3)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

第10章 排序(3)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
11/41
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
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3 约定 在本章中 1)为简洁起见,对待排记录只写出其排序码序列
如对待排记录((09,10),(06,10.5),(033,9.8),(051,10)) 只写出其关键字序列(10,10.5,9.8,10) 2)将按关键字递增的顺序排序
3)待排序记录用顺序表存储
顺序表类型说明
#define MAXSIZE 20 //一个用作示例的小顺序表的最大长度
特点: 1) 算法简单 2) 时间复杂度为O(n2 ) 3)初始序列基本(正向)有序时,时间复杂度为O(n) 4)稳定排序
该方法适用于记录基本(正向)有序或n较少的情况
10.2.2 其他插入排序
1.二分插入排序 1)基本思想 二分插入排序(Binary Insert Sort)的基本思想是:在有序表中采用
2.存贮方式 待排序的记录序列通常有下列三种存贮方法: 1)顺序表 2)静态链表:在排序过程,只需修改指针,不需要移动记录; 3)待排记录本身存放在连续单元中,同时另建一索引表——用于 存放各记录存贮位置;排序时不移动记录本身,而移动索引表中 的记录“地址”,在排序结束后再按地址调整记录的存贮位置
typedef int KeyType; //定义关键字类型为整数类型
typedef struct{
KeyType key;
//关键字项
InfoType otherinfo; //其它数据项
}RedType;
//记录类型
typedef struct{
RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
10
M 49 38 65 97 76 13 27 49’ 2 01
2)算法实现 见P270 算法10.3 是将排好序的静态链表按指针顺序进行记录调整
3)性能分析 从算法可见,表插入排序的基本操作仍是将一个记录插入到已排
好序的有序表中,不同之处仅在于以修改2n次指针代替移动记录, 关键字比较次数相同,时间复杂度仍是O(n2)
一趟直接插入 排序
2.直接插入的算法实现
void InsertSort(SqList &L) { //对顺序表L作直接插入排序。
for (i=2; i<=L. length; ++i){
if LT(L.r[i].key, L.r[i-1].key){
//若L.r[i].key < L.r[i-1].key,需将L.r[i]插入有序子表,
二分插入算法与直接插入算法的元素移动一样是顺序的,因此该 方法也是稳定的。
2.表插入排序 1)基本思想 记录放在静态链表中,进行插入排序,可以不移动元素。
#define SIZE 100 Typedef struct{
RcdType rc; int next; }SLNode; Typedef struct{ SLNode r[SIZE]; int length; }SLinkListType;
(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)
7).排序的时间复杂性
排序过程主要是对记录的排序码进行比较和记录的移动过程。 因此排序的时间复杂性可以算法执行中的数据比较次数及数据移 动次数来衡量。当一种排序方法使排序过程在最坏或平均情况下 所进行的比较和移动次数越少,则认为该方法的时间复杂性就越 好,分析一种排序方法,不仅要分析它的时间复杂性,而且要分 析它的空间复杂性、稳定性和简单性等。
76 38 49 65 97 97 13 27 49
0 1 23 4 5 67 8 9
76 38 49 65 9776 97 13 27 49
3.直接插入排序的效率分析
从算法可以看出,直接插入排序算法十分简单。那么它的效率如何 呢?首先从空间来看,它只需要一个元素的辅助空间,用于元素的位 置交换。
24
例 初始: 49 38 65 97 76 13 27 48 55 4
取d1=5 一趟分组:
49
38
65
97
76
13
27
48
55
4
一趟排序: 13 27 48 55 4 49 38 65 97 76
取d2=3 二趟分组:
13
27
48
55
4
49 38 65 97 76
二趟排序: 13 4 48 38 27 49 55 65 97 76 取d3=1
L.r[5]复制为哨兵
76 38 49 65 97 76 13 27 49
0 1 23 4 5 6 78 9
76 38 49 65 97 97 13 27 49
L.r[0].key < L.r[4].key , L.r[4]记录后移
L.r[0].key L.r[3].key
找到插入位置
插入!
0 1 23 4 5 67 8 9
int length;
//顺序表长度
}SqList;
//顺序表类型
排序
插入排序(直插排序、二分排序、表插入排序、 希尔排序) 交换排序(冒泡排序、快速排序)
选择排序 (直选排序、树型排序、堆排序)
10.2 插入排序
10.2.1 直接插入排序
1.基本思想 直接插入排序(Straight Insertion Sorting)的基本思
5).稳定与不稳定
因为排序码可以不是记录的关键字,同一排序码值可能对应 多个记录。对于具有同一排序码的多个记录来说,若采用的排序 方法使排序后记录的相对次序不变,则称此排序方法是稳定的, 否则称为不稳定的。
6).内排序与外排序
按照排序过程中使用内外存的不同将排序方法分为内排序和 外排序。若排序过程全部在内存中进行,则称为内排序;若排序 过程需要不断地进行内存和外存之间的数据交换,则称为外排序。 内排序大致可分为五类:插入排序、交换排序、选择排序、归并 排序和分配排序。本章仅讨论内排序。
Donald L. Shell 博士(1924- )在计算机科学领域的贡献是 ShellSort 。 1984 年退休。
1951年获取硕士学位, 1959 年博士学位。
希尔在1959年针对插入排序作了改进,提出了一个缩小增量排 序方法。 方法:先取一个正整数d1<n,把所有相隔d1的数据作为一组,组 内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作; 直至di=1。
3)适用于n 较大情况
10.3 快速(交换)排序
将待排记录中两两记录关键字进行比较,若逆序则交换位置。
例:49 38 65 97 76 13 27 49 若按关键字递增的顺序排序,则 49 38 为逆序
不同的比较顺序就得到不同的交换排序方法
10.3.1起泡排序
1.起泡排序(Bubble Sorting)的基本思想是:是通过对待 排序序列从后向前(从下标较大的元素开始),依次比较相邻元素 的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移 向前部(从下标较大的单元移向下标较小的单元),就象水底下的 气泡一样逐渐向上冒。
第十章 内部排序
10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序
学习要点 1 理解排序的定义和各种排序方法的特点; 2 了解各种方法的排序过程及其依据的原则; 3 理解“稳定”或“不稳定”的含义;
10.1 概 述
排序(Sorting)是数据处理中一种很重要的运算,同时 也是很常用的运算,一般数据处理工作25%的时间都在进行排 序。简单地说,排序就是把一组记录(元素)按照某个域的值 的递增(即由小到大)或递减(即由大到小)的次序重新排列 的过程。
} }//InsertSort
0 12345678 9
49 38 65 76 97 13 27 49
初始时,有序子表中 只有一个元素
看一下外层For循环 i=5 时算法的执行的情况 0 1 2 3 4 5 6 7 8 9
38 49 65 97 76 13 27 49
L.r[5]为待插入元素
0 1 23 4 5 67 8 9
从时间分析:
基本正序 ,只比较,不移动元素,待插入元素传送2次。总比较次 数为(n-1),传送次数为2(n-1)。O(T)=O(n)
基本逆序,对每个元素i, 比较i次,总次数 i=2i=(n+2)(n+1)/2, 移动 i-1+2次 , i=2(i+1)=(n+4)(n-1)/2。 O(T)=O(n2) 综合两种情况,平均n2 /4
10.2.3 希尔排序 1.希尔排序的基本思想
希尔排序(Shell Sort)又称为“缩小增量排序”。是1959年由 D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割 成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插 入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元 素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下 (接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两 种方法有较大提高。
以上述说明的静态链表作为存储结构,为了插入方便,设数组中下 标为0的分量为表头结点,并令表头结点记录的关键字取最大整数 MAXINT。则表插入排序如下:首先将静态链表中数组下标为1的分量 与表头结点构成一个循环链表,然后依次将下标为2到n的记录插入到 循环链表中。
012345678 M 49 38 65 97 76 13 27 49’
相关文档
最新文档