数据结构讲义第10章

合集下载

数据结构第10章

数据结构第10章

算法评价(参考)
时间复杂度
若待排序记录按关键字从小到大排列(正序) 关键字比较次数: 记录移动次数:0 若待排序记录按关键字从大到小排列(逆序)
1 n 1
i 2
n
(n 2)(n 1) 2 i 2 n (n 4)(n 1) 记录移动次数: (i 1) 2 i 2
时间复杂度:O(nlogn)
10.3 快速排序分析
快速排序在最好情形下(左、右子区间的长度
大致相等),则结点数n与二叉树深度h应满足 log2n<h<log2n+1,所以总的比较次数不会超 过(n+1)log2n。因此,快速排序的最好时间复 杂度应为O(nlog2n)。理论上已经证明,快速 排序的平均时间复杂度也为O(nlog2n)。 在最坏情况下(逆序或正序),时间复杂度为 O(n2) 空间复杂度:O(logn)
10.3 交换排序 冒泡排序 排序过程
将第一个记录的关键字与第二个记录的关
键字进行比较,若为逆序r[1].key>r[2].key, 则交换;然后比较第二个记录与第三个记 录;依次类推,直至第n-1个记录和第n个 记录比较为止——第一趟冒泡排序,结果 关键字最大的记录被安置在最后一个记录 上 对前n-1个记录进行第二趟冒泡排序,结果 使关键字次大的记录被安置在第n-1个记录 位置 重复上述过程,直到“在一趟排序过程中 没有进行过交换记录的操作”为止

假设含 n 个记录的序列为 { R1 ,R2 ,…,Rn } 其相应的关键字序列为 { K1,K2,…,Kn } 需确定1,2,…,n的一种排列 p1,p2,…,pn 使关键字满足非递减(或非递增)关系 Kp1≤Kp2≤…≤Kpn 即使初始的的序列成为一个按关键字有序的 序列 { Rp1,Rp2,…,Rpn} 这样一种操作称为排序。

数据结构第十章共48页PPT资料

数据结构第十章共48页PPT资料
3
.各节给出算法运行时间代价的大略估算一般都 按平均情况进行估算.对于那些受对象关键码序 列初始排列及对象个数影响较大的,需要按最好 情况和最坏情况进行估算.
.插入排序
.插入排序的基本思想每步将一个待排序的对象, 按其关键码大小,插入到前面已经排好序的一组 对象的适当位置上,直到对象全部插入为止.
Байду номын сангаас .内部排序:待排序的序列存放在计算机的内存 中进行的排序过程.
.外部排序:若待排序的记录量很大,以致内存中一 次不能容纳全部记录,在排序过程中需对外存进行 访问的排序过程.
.本章讨论内部排序,且所有关键字都是整数,待排 序的记录以顺序存储结构存储.
.排序的时间开销:排序的时间开销是衡量算法好 坏的最重要的标志.排序的时间开销可用算法执行 中的数据比较次数与数据移动次数来衡量.
21 25 49 25* 16 08
13
21 16 08 25* 25 49
i=2
012345
Gap = 2
21 16 08 25* 25 49
21 16 08 25* 25 49
08 16 21 25* 25 49
14
08 16 21 25* 25 49
i=3
012345
Gap = 1
08 16 21 25* 25 49
然后缩小间隔 gap,例如取 gap = gap/2,重复 上述的子序列划分和排序工作.
直到最后取 gap == 1,将所有对象放在同一个 序列中,排序就结束.
12
21 25 49 25* 16 08
i=1
012345
Gap = 3
21 25 49 25* 16 08
21 25 49 25* 16 08

数据结构第10章

数据结构第10章

24
15
16
21
1 00
18
26
38
30
25
50
28
1 10
40
… …













1
2
3
4
5
6
7
8
图10.8 对应于图10.6的败方树
第10章 外部排序
全 局优 胜者
8
9 15
20
15
… …


15 25
顺 串 4
图10.9 败方树的修改
第10章 外部排序
图10.11 磁带排序过程
第10章 外部排序
2. 非平衡归并
设初始顺串的长度为度量单位,即规定初始顺串的长度为1, 用Sn来表示某台磁带机上有n个顺串,每个顺串的长度为S。
假设初始顺串有八个,则在T1上分配五个顺串,在T2上分配 三个顺串,然后把T2上的三个顺串与T1中的三个顺串相归并, 得到三个长度为2的顺串,将它们写到T3上。下一步把T1中的两 个顺串与T3中的两个顺串相归并,得到两个长度为3的顺串,把 它们写到T2上。再下一步是把T3上一个长度为2的顺串与T2中的 一个长度为3的顺串进行归并,得到一个长度为5的顺串,将其 写到T1上。最后,把T1上一个长度为5的顺串与T2上一个长度为3 的顺串进行归并,得到一个长度为8的顺串,把它写到T3上。至 此,完成了非平衡2路归并排序。
第10章 外部排序
图10.12 采用非平衡分布法用三台磁带机实现2路归并
第10章 外部排序
图10.13 三带2路归并的顺串分布

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

数据结构第10章

数据结构第10章

e.g: 将序列 49、38、65、97、76、13、27、49 用 起泡 排序的方法进行排序。
0 1 2 3 4 5 6 7 8
49
49
38
65 65
97
76 76
13
27 27
49
38
97
13
49
15
算法描述
void bubble_sort(int a[],int n) change=Ture {for(i=n- 1;i>=1&&change;--i) 算法评价 {change=False; 时间复杂度 for(j=0;j<I;++j) if(a[j]>a[j+1] 最好情况(正序) {a[j] ←→ a[j+1];change=True}}} 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数: 移动次数:
}∥for
}∥StrInsSort1
算法评价
若待排序记录按关键字从小到大排列(正序) 最好的情况 关键字比较次数: 记录移动次数: 0 若待排序记录按关键字从大 到小排列(逆序) 最坏的情况 关键字比较次数: 记录移动次数: 若待排序记录是随机的,取平均值 关键字比较次数: 记录移动次数:
T(n)=O(n² )
42 70 85 ) 20
42 70 85 ) 20 j 42 70 85 ) 20 42 70 85 ) 20
i=8 20 (6 s i=8 20 (6 s i=8 20 (6
i=8 20 (6
i=8 20 (6
42 70 85 ) 20
42 70 85 )
13 20 30 39
算法描述
Status BInsertSort ( SqList &L ) { for ( i = 2; i <= L.length ; ++i ) { L.r[0] = L.r[i]; low = 1 ; high = i-1 ; while ( low <= high )

数据结构 chapter10

数据结构  chapter10

Department of Computer Science & Technology, Nanjing University
fall
DATA STRUCTURES
多级索引结构形成 m 路搜索树
Department of Computer Science & Technology, Nanjing University
第10章 文件组织、索引结构
文件组织 动态索引结构
Department of Computer Science & Technology, Nanjing University Data Structure
fall
10.1 文件组织
DATA STRUCTURES
文件的基本概念
什么是文件 文件是存储在外存上的数据结构。 文件分操作系统文件和数据库文件
是指向子树的指针,0 i n < m;Ki 是关键码, 1 i n < m。 Ki < Ki+1, 1 i < n。
▪ 在子树 Pi 中所有的关键码都小于 Ki+1,且大于 Ki, 0 < i < n。
▪ 在子树 Pn 中所有的关键码都大于Kn; ▪ 在子树 P0 中的所有关键码都小于 K1。 ▪ 子树 Pi 也是 m 路搜索树,0 i n。
Department of Computer Science & Technology, Nanjing University
fall
DATA STRUCTURES
索引表用于指示逻辑记录与物理记录间的对应关 系,它是按关键码有序的表。
索引顺序文件:主文件也按关键码有序。此时 可对主文件分组,一组记录对应一个索引项。 称这种索引表为稀疏索引。

数据结构第10章排序

数据结构第10章排序

*10.8.5 最佳归并树
*10.8.6 磁带排序
2019/10/29
3
3
主要内容
知识点
1、排序的定义,排序可以看作是线性表的一种操作 2、排序的分类,稳定排序与不稳定排序的定义。 3、插入排序(直接插入、对分插入、二路插入、表插入、希尔插
入排序)。
4、交换排序(冒泡排序、快速排序)。 5、选择排序(简单选择排序、树形选择排序、堆排序)。 6、归并排序、基数排序。 7、外部排序 重点难点
1、各种排序所基于的基本思想。 2、排序性能的分析,是否是稳定排序。 3、折半插入、希尔排序。 4、快速排序。 5、堆排序。 6、败者树、置换选择排序、最佳归并树。 7、对每种排序方法的学习,能举一反三。
2019/10/29
4
4
基本概念
排序: 假设含n个记录的序列为{R1, R2, …,Rn }, 其相应的关键字序列为 { K1, K2, …,Kn }, 这些关键字相互之间可以进行比较,即在它
10.4 选择排序
10.4.1 直接选择排序
10.4.2 树形选择排序
10.4.3 堆排序
10.5 归并排序
10.6 分配排序
10.7 内部排序方法的比较
10.8 外部排序
10.8.1 文件管理 10.8.2 外部排序 10.8.3 多路归并排序
10.8.4 置换选择排序

else { low=first;high=n;

while (low<=high)

{ m=(low+high)/2;

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

数据结构第10章

数据结构第10章


目的
对折半插入排序的改进,减少记录的移动次数。
Data Structure
2013-6-28
Page 16
初始关键字
49
38
65
97
76
13
27
49
i=1
i=2
(49)
firstfinal
(49)
final
(38)
first
i=3
(49
65)
final
(38)
first
i=4
(49
65
97)
final
Page 12
10.2.2 其它插入排序
折半插入排序

基本思想 用折半查找方法确定插入位置的排序。
i=1 i=2 13
(30) (13
13 30)
70 70
85 85
39 39
42 42
6 6
20 20
i=7 i=8
i=8
Data Structure

6 20
(6 (6 i (6
13 插入位置 39 30 13 h m 13 30 imh 20 39 m 30
76
97)
final
(13
first
27
38)
Data Structure
2013-6-28
Page 18
初始关键字 i=7
49 (49
38 65
65 76
97 97)
final
76
13 (13
first
27 27
49 38)
i=8
(49
49
65
76
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

直接插入排序
算法分析: 算法分析: 空间分析:需要一个记录的辅助空间。 空间分析:需要一个记录的辅助空间。 时间分析: 时间分析: 若记录关键字已按非递减排列,每趟排序插入, 1、若记录关键字已按非递减排列,每趟排序插入,只 需进行一次关键字比较,则总的比较次数为n 需进行一次关键字比较,则总的比较次数为n-1。算法时间 复杂度为O(n) O(n)。 复杂度为O(n)。 若关键字已按非递增排列,则对第i 2、若关键字已按非递增排列,则对第i个记录进行查找 插入时,要比较i次,移动i+1个记录。则总的比较次数为 插入时,要比较i 移动i+1个记录。 i+ i=(n+2 (n- )/2 +n- )/2 (i=2..n) ∑i=(n+2)(n-1)/2=(n2+n-2)/2 (i=2..n) 移动记录数为∑(i+1)=(n+4)(n- )/2 )/2 移动记录数为∑(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2 平均比较次数=((n +n- )/2+n- )/2 n/4 平均比较次数=((n2+n-2)/2+n-1)/2=n2/4+3n/4-1≈n2/4 平均移动次数=((n )/2 (n- ))/2 平均移动次数=((n2+3n-4)/2+2(n-1))/2 n/4 =n2/4+7n/4-2≈n2/4 则直接插入排序的时间复杂度为O(n 则直接插入排序的时间复杂度为O(n2) 直接插入排序为稳定的排序方法。 直接插入排序为稳定的排序方法。
直接插入排序
算法: 算法: void InsertSort(SeqLiat &L) { int i,j; for (i=2;i<=L.length;++i) //对每一个 i∈R 对每一个R 对每一个 if LT(L.r[i].key, L.r[i-1].key) { L.r[0]=L.r[i]; for (j=i-1;LT (L.r[0].key, L.r[j].key);--j) //寻找插入位置 寻找插入位置j 寻找插入位置 L.r[j+1]=L.r[j]; //将j..i-1 的记录后移一格 将 L.r[j+1]=L.r[0]; //将Ri插入到位值 将 插入到位值j } }
基本概念 §10.1 基本概念
1、排序 排序: 排序 : 设 {R1,R2,...,Rn}是n 个记录的序列, 其相应的关键 是 个记录的序列, 字为{K 的一种排列p 字为 1,K2,…,Kn}。 需确定 。 需确定1,2,…,n的一种排列 1,p2,…,pn , 的一种排列 使其相应满足下面的非递减(或非递增)关系: 使其相应满足下面的非递减(或非递增)关系: Kp1≤Kp2≤...≤Kpn 使上面n个记录的序列成为一个按关键字有序的序列 使上面n { Rp1,Rp2,...,Rpn} 这样一种操作称为排序。 这样一种操作称为排序。 即排序是一个将记录关键字无序的序列调整为一个按 关键字有序(递增(非递减) 递减(非递增))的记录序列。 ))的记录序列 关键字有序(递增(非递减)、递减(非递增))的记录序列。 用于排序的关键字K 可以是记录的主关键字, 用于排序的关键字 i:可以是记录的主关键字,也可以 是次关键字,甚至还可以是若干数据项的集合。 是次关键字,甚至还可以是若干数据项的集合。 若是主关键字,则排序的结果是唯一的。 若是主关键字,则排序的结果是唯一的。 若是次关键字,排序结果不唯一。 若是次关键字,排序结果不唯一。
基本概念 基本概念
为了讨论方便,假设记录关键字均为整数。 为了讨论方便,假设记录关键字均为整数。 待排序的记录的数据类型为: 待排序的记录的数据类型为: #define n 100 typedef int KeyType; typedef struct { KeyType key; InfoType otherinfo; }RecType; typedef RecType SeqList[n+1]; 若关键字类型没有比较算符, 若关键字类型没有比较算符 , 可事先定义宏或函数来 表示比较算符。如字符串比较。 表示比较算符。如字符串比较。
基本概念 基本概念
4、排序过程进行的操作: 排序过程进行的操作: 比较操作: 比较两个关键字的大小-- 必不可少的操作。 --必不可少的操作 ① 比较操作 : 比较两个关键字的大小 -- 必不可少的操作 。 ② 改变记录的逻辑联系或将一个记录从一个位置移动到 另一个位置。 另一个位置。 是否需要移动,与待排序记录的存储方式有关: 是否需要移动,与待排序记录的存储方式有关: 以顺序表作为存储结构: ① 以顺序表作为存储结构 : 当两个记录关键字不满足给 定关系时,必须移动记录。 定关系时,必须移动记录。 以链表作为存储结构, ② 以链表作为存储结构 , 通过修改指针来改变记录的逻 辑关系,不需移动记录。通常这种排序为链表排序。 辑关系,不需移动记录。通常这种排序为链表排序。 若存储在一组地址连续的存储单元中, ③ 若存储在一组地址连续的存储单元中 , 另设一地址向 量来指示各记录的存储位置。 量来指示各记录的存储位置。排序过程中通过移动地址向量 中的记录的“地址”来改变记录的次序关系。 中的记录的“地址”来改变记录的次序关系。(排序完成后 再调整记录的存储位置, 再调整记录的存储位置 , 这种存储方式的排序评价排序算法的标准: 评价排序算法的标准: 执行时间; ①执行时间; 所需辅助空间。 ②所需辅助空间。 若所需辅助空间不依赖于问题的规模n 若所需辅助空间不依赖于问题的规模n,即辅助空间为 O(1 则称为就地排序。 O(1),则称为就地排序。 非就地排序所要求的辅助空间为 O(n)。 O(n)。 排序算法的时间开销主要是关键字的比较次数和记录 的移动次数。算法执行时间不仅取决于问题的规模, 的移动次数。算法执行时间不仅取决于问题的规模,而且 取决于输入实例中的数据状态,分析中一般给出最好、 取决于输入实例中的数据状态,分析中一般给出最好、 最 坏和平均的三种时间性能评价。 坏和平均的三种时间性能评价。 本章所讨论的排序, 除基数排序外, 本章所讨论的排序 , 除基数排序外 , 都是采用顺序表 作为存储结构。 作为存储结构。
基本概念 基本概念
2、排序的稳定性: 排序的稳定性: 假设K 假设 i=Kj,i≠j, 且在排序前的序列中 i 领先 j ( 即 i< , 且在排序前的序列中R 领先R < j),若在排序后的序列中,Ri仍领先 j,则称所用的排序 ) 若在排序后的序列中, 仍领先R 方法是稳定的。 方法是稳定的。 若在排序后的序列中, Rj领先Ri ,则称所用的排序方 若在排序后的序列中, 领先 法是不稳定的。 法是不稳定的。 排序算法的稳定性是指对所有输入实例而言, 排序算法的稳定性是指对所有输入实例而言 , 只要能 找出一个实例能证明其是不稳定的, 找出一个实例能证明其是不稳定的, 就能说明它是不稳定 的。 3、内排序:排序期间,全部记录都存放在内存。 、内排序:排序期间,全部记录都存放在内存。 外排序:排序期间,只有部分记录在内存, 外排序 : 排序期间 , 只有部分记录在内存 , 随时存在 记录的内外存交换。 记录的内外存交换。
折半插入排序
方法: 先利用折半查找方法来确定插入位置, 方法 : 先利用折半查找方法来确定插入位置 , 然后向 后移动元素进行插入。 后移动元素进行插入。 优点:比较次数少,但移动元素个数相同。 优点:比较次数少,但移动元素个数相同。 void BinaryInsertSort(SeqLiat &L) { for(i=2; i<= L.length; i++) //共进行n-1次插入 共进行n 共进行 { L.r[0]=L.r[i]; left=1;right=i-1; ; while(left<=right) { mid=(left+right)/2; if(L.r[0].key<L.r[mid].key) right=mid-1; else left=mid+1; } for( j=i-1;j>=left;j--) L.r[j+1]=L.r[j]; //元素后移 元素后移 L.r[left]=L.r[0]; } }
第十章 内部排序
信息查找是信息系统的最主要的操作。 信息查找是信息系统的最主要的操作。如何 在大量信息中快速找到所需要的信息一直是信息 查找所追求的目标。如果数据是按照某种合理的 查找所追求的目标。 顺序进行存储,则查找将是最有效的。 顺序进行存储,则查找将是最有效的。 排序就是使数据有序的一种基本操作, 排序就是使数据有序的一种基本操作,是组 织数据的最基本运算,采用更有效的排序方法, 织数据的最基本运算,采用更有效的排序方法, 能很好地提高计算机的效率。 能很好地提高计算机的效率。
直接插入排序
寻找R[i]的插入位置的方法 寻找R[i]的插入位置的方法:从j=i-1 的记录位置开始 R[i] 的插入位置的方法: j=i依次向前比较: 依次向前比较: R[i].key<R[j].key(j=i- ,i- ..., ),则将 R[j]后 则将R[j] 若 R[i].key<R[j].key(j=i-1,i-2,...,1), 则将 R[j] 后 移一个位置; 移一个位置; R[i].key≥R[j].key, 则插入位置找到, R[i]插 若 R[i].key≥R[j].key , 则插入位置找到 , 将 R[i] 插 入到第j+ 个位置。 j+1 入到第j+1个位置。 在含有i 个记录的有序表R[ ..i R[1 中插入记录R[i] 在含有 i-1 个记录的有序表R[1..i-1]中插入记录R[i] 就变成了有i个记录的有序表R[ ..i] R[1 i]。 后, 就变成了有i 个记录的有序表R[1..i]。 在查找插入位 置的过程中,为了避免测试j>= j>=1 R[0 处设置监视哨。 置的过程中, 为了避免测试j>=1, 在R[0]处设置监视哨。 即令: 即令: R[0 R[0]=R[i] 这样,在向前搜索过程中,总有一个记录有 R[i].key≥R[j].key。因此, R[i].key≥R[j].key 。 因此 , 引入哨兵元素简化了边界条 件的判断,使得测试查找循环条件的时间减少一半。 件的判断,使得测试查找循环条件的时间减少一半。
相关文档
最新文档