第十章_排序方法(数据结构ppt-严蔚敏)
严蔚敏数据结构C语言 原PPT课件

4358 3485 6552 5145 1354 3625 7272 2420 4707
n-i次
…
第n-1趟 排序结束
25
第25页/共58页
第10章 内部排序
10.3 交换类排序
①冒泡排序(相邻比逆法)
void BubbleSort(RecordType r[ ],int length)
{ n=length;
数
据
结
有序序列a[1..i-1]
构
a[i]
无序序列 a[i..n-1]
有序序列a[1..i]
无序序列 a[i+1..n-1]
7
第7页/共58页
第10章 内部排序 10.2 插入类排序
实现“一趟插入排序”可分三步进行:
1.在a[1..i-1]中查找a[i]的插入位置,
数
a[1..j].key a[i].key < a[j+1..i].key;
low = 1; high = i-1;
while (low<=high)
数
{
据
结
构
m= (low+high)/2;
if (L.r[0].key < L.r[m].klse low = m+1;
18
第18页/共58页
第10章 内部排序 10.2 插入类排序
③希尔排序 (又称缩小增量排序)
数 { R[1],R[1+d],R[1+2d],…,R[1+kd] }
据 { R[2],R[2+d],R[2+2d],…,R[2+kd] }
结
…
构 { R[d],R[2d],R[3d],…,R[kd],R[(k+1)d] }
教学课件 数据结构--严蔚敏

1.1 数据结构讨论的范畴
Niklaus Wirth:
Algorithm + Data Structures = Programs
程序设计:
算法: 数据结构:
为计算机处理问题编制 一组指令集
处理问题的策略
问题的数学模型
例如: 数值计算的程序设计问题
结构静力分析计算 ─━ 线性代数方程组
全球天气预报 ─━ 环流模式方程 (球面坐标系)
非数值计算的程序设计问题
例一: 求一组(n个)整数中的最大值 算法: ? 基本操作是“比较两个数的大小” 模型:? 取决于整数值的范围
例二:计算机对弈
算法:? 对弈的规则和策略 模型:? 棋盘及棋盘的格局
例三:足协的数据库管理
S 是 D上关系的有限集。
数据的存储结构
—— 逻辑结构在存储器中的映象
“数据元素”的映象 ?
“关系”的映象 ?
数据元素的映象方法:
用二进制位(bit)的位串表示数据元素 (321)10 = (501)8 = (101000001)2 A = (101)8 = (001000001)2
关系的映象方法:(表示x, y的方法)
抽象数据类型的表示和实现
抽象数据类型需要通过固有数据 类型(高级编程语言中已实现的数据 类型)来实现。
例如,对以上定义的复数。
// -----存储结构的定义
typedef struct { float realpart; float imagpart;
}complex;
// -----基本操作的函数原型说明
顺序映象
以相对的存储位置表示后继关系 例如:令 y 的存储位置和 x 的存储位置之间差一个常量 C
数据结构 C语言版(严蔚敏版)第10章 排序

交换排序
排序方法
选择排序
归并排序 (二路归并排序) 基数排序 (链式基数排序)
2012-12-21
12
10.2 插入排序
直接插入排序、折半插入排序、希尔排序 插入排序的主要思路是不断地将待排序的 数值插入到有序段中,使有序段逐渐扩大,直 至所有数值都进入有序段中位置。
2012-12-21
13
1、直接插入排序: 基本思想:从数组的第2号元素开始, 顺序从数组中取出元素,并将该元素插入 到其左端已排好序的数组的适当位置上。
MAX … … …
2012-12-21
10
排序的功能:
将一个数据元素(或记录)的任意序列,重 新排成一个按关键字有序的序列。 排序过程的组成步骤: 首先比较两个关键字的大小; 然后将记录从一个位置移动到另一个位置。
2012-12-21
11
插入排序
直接插入排序 折半插入排序 希尔排序 起泡排序
快速排序 简单选择排序 堆排序
一共需要经过n-1趟就可以将初始序列的n 个记录重新排列成按关键字值大小排列的有序 序列。
举例:
2012-12-21
14
2012-12-21
15
直接插入排序: 基本思想:从数组的第2号元素开始,顺序从数组中取出元素, 并将该元素插入到其左端已排好序的数组的适当位置上。
待排元素序列: [53] 27 36 15 69 42 第一次排序:27 [27 53] 36 15 69 42 第二次排序:36 [27 36 53] 15 69 42 第三次排序:15 [15 27 36 53] 69 42 第四次排序:69 [15 27 36 53 69] 42 该算法适合于n 较 小的情况,时间复 杂度为O(n2).
数据结构严蔚敏PPT完整版2024新版

选择排序的基本思想
在未排序序列中找到最小(或最大)元素,存放到排序 序列的起始位置,然后,再从剩余未排序元素中继续寻 找最小(或最大)元素,然后放到已排序序列的末尾。 以此类推,直到所有元素均排序完毕。
交换排序和归并排序
交换排序的基本思想
通过不断地交换相邻的两个元素(如果它们的顺序错 误)来把最小的元素“浮”到数列的一端。具体实现 时,从第一个元素开始,比较相邻的两个元素,如果 前一个比后一个大,则交换它们的位置;每一对相邻 元素做同样的工作,从开始第一对到结尾的最后一对 ;这步做完后,最后的元素会是最大的数;针对所有 的元素重复以上的步骤,除了最后一个;持续每次对 越来越少的元素重复上面的步骤,直到没有任何一对 数字需要比较。
归并排序的基本思想
将两个或两个以上的有序表合并成一个新的有序表。具 体实现时,把长度为n的输入序列分成两个长度为n/2 的子序列;对这两个子序列分别采用归并排序;将两个 排序好的子序列合并成一个最终的排序序列。
查找的基本概念和方法
查找的定义
根据给定的某个值,在查找表中确定 一个其关键字等于给定值的数据元素 的过程或操作。
数组的定义和基本操作
数组的定义
数组(Array)是由相同类型的元素( element)的集合所组成的数据结构 ,分配一块连续的内存来存储。利用 元素的索引(index)可以计算出该 元素对应的存储位置。
数组的基本操作
数组的基本操作包括数组的创建、数 组的初始化、数组的访问、数组的遍 历、数组的排序和数组的查找等。
顺序表的基本操作实现
包括插入、删除、查找等操作,时间复杂度为 O(n)。
顺序表的特点
支持随机访问,存储密度高,但插入和删除操作需要移动大量元素。
数据结构严蔚敏ppt课件

数据结构严蔚敏ppt课件数据结构(严蔚敏)版●资料上传者:安徽大学研究生●资料使用范围:各大学考研及本科教学●欢迎报考安徽大学研究生●“星光考研书屋”祝您学习愉快[学习目标]掌握线性表的顺序存储结构和抽象数据类型中定义的每一种操作的含义,在顺序存储方式下每一种操作的具体实现和相应的时间复杂度;掌握链接存储的概念,线性表的单、双链接存储结构,对它们进行插入和删除结点的方法,循环单、双链表和带表头附加结点的单、双链表的结构和操作特点;掌握每一种线性表操作在由动态结点构成的单链表上具体实现的算法以及相应的时间复杂度。
2第2章线性表线性结构是最常用、最简单的一种数据结构。
而线性表是一种典型的线性结构。
其基本特点是线性表中的数据元素是有序且是有限的。
在这种结构中:① 存在一个唯一的被称为“第一个”的数据元素;② 存在一个唯一的被称为“最后一个”的数据元素;③ 除第一个元素外,每个元素均有唯一一个直接前驱;④ 除最后一个元素外,每个元素均有唯一一个直接后继。
32.1 线性表的逻辑结构线性表(Linear List ) :是由n(n ≧0)个数据元素(结点)a 1,a 2,…a n 组成的有限序列。
该序列中的所有结点具有相同的数据类型。
其中数据元素的个数n 称为线性表的长度。
当n=0时,称为空表。
当n>0时,将非空的线性表记作: (a 1,a 2,…a n ) a 1称为线性表的第一个(首)结点,a n 称为线性表的最后一个(尾)结点。
2.1.1 线性表的定义4a1,a2,…a i-1都是a i(2≦i≦n)的前驱,其中a i-1是a i的直接前驱;a i+1,a i+2,…a n都是a i(1≦i ≦n-1)的后继,其中a i+1是a i 的直接后继。
2.1.2线性表的逻辑结构线性表中的数据元素a i所代表的具体含义随具体应用的不同而不同,在线性表的定义中,只不过是一个抽象的表示符号。
◆线性表中的结点可以是单值元素(每个元素只有一个数据项) 。
数据结构(严蔚敏)完整第10章ppt课件

一般情况下,
假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn }
这些关键字相互之间可以进行比较,即在
它们之间存在着这样一个关系 :
Kp1≤Kp2≤…≤Kpn
按此固有关系将上式记录序列重新排列为
{ Rp1, Rp2, …,Rpn }
的操作称作排序。
有序序列区 无 序 序 列 区
经过一趟排序
有序序列区 无 序 序 列 区
03.07.2020
.
11
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
插入类 交换类 选择类
归并类 其它方法
03.07.2020
.
12
#待de排fin记e M录A的XS数IZ据E 类10型00定// 待义排如顺下序:表最大长度
03.07.2020
.
15
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它 加入到有序子序列中,以此方法增 加记录的有序子序列的长度。
03.07.2020
.
16
4. 归并类
通过“归并”两个或两个以上的 记录有序子序列,逐步增加记录有 序序列的长度。
5. 其它方法
03.07.2020
.
5
03.07.2020
10.1 概述
10.2 插入排序
10.3 快速排序
10.4 堆排序 10.5 归并排序
10.6 基数排序
10.7 各种排序方法的综合比较
03.07.2020
10.8 外. 部排序
6
10.1 概 述
一、排序的定义 二、内部排序和外部排序 三、内部排序方法的分类
数据结构第十章排序严蔚敏.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)。
首先把这些数据按任意次序置入完全二叉树 的各结点中,由于原始数据的次序是任意的, 此树一般不符合堆的条件,需要用筛选运算 进行调整。
数据结构严蔚敏排序

归并排序: 2-路归并排序 k-路归并排序
基数排序: 多关键字排序 最高位优先法 最低位优先法 链式基数排序
(2)对单链表的排序: 直接插入,简单选择,冒泡排序,基数排序
华中科技大学计算机学院 9
10.2 插入排序
算法基本思想 将待排序的记录插入到已排序的子文件中去,使得
插入之后得到的子文件仍然是有序子文件。插入一个记 录,首先要对有序子文件进行查找,以确定这个记录的 插入位置。按查找方式的不同,插入排序又可以分为线 性插入排序和折半插入排序,前者使用顺序查找,后者 使用折半查找。
{ int i,j;
for (i=2;i<=n;i++)
{ r[0]=r[i];
//待插记录r[i]存入监视哨中
low = 1 ; high = i - 1;
while ( low <= high )
{ m = ( low + high ) / 2 ;
if ( r[0].key <r[m].key )
学 号 姓 名 数学 外语
1 20052 王 洋 60 70
不稳定 2 20038 刘 伟 的排序 3 20051 刘大海
80 70 80 75
4 20066 吴晓英 82 88
5 20042 王 伟 90 83
(e) 按数学成绩排列的有序表
华中科技大学计算机学院 4
3.内部排序(内排序)----在计算机内存中进行的排序 外部排序(外排序)----借助计算机外存进行的排序
第5遍: 3 2 1 4 5 6 7 8 9 10 [0—10-5)
第6遍: 2 1 3 4 5 6 7 8 9 10 [0—10-6)
第7遍: 1 2 3 4 5 6 7 8 9 10 [0—10-7)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二个问题解决方法——筛选
方法:输出堆顶元素之后,以堆中最后一个元素替代之;然 后将根结点值与左、右子树的根结点值进行比较,并与其中 小者进行交换;重复上述操作,直至叶子结点,将得到新的 堆,称这个从堆顶至叶子的调整过程为“筛选”
例 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个元素 的次小值;重复执行,得到一个有序序列,这个过程 叫~ 堆排序需解决的两个问题:
如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新 的堆?
按排序所需工作量
简单的排序方法:T(n)=O(n² ) 先进的排序方法:T(n)=O(logn)
排序基本操作
比较两个关键字大小 将记录从一个位置移动到另一个位置
§10.1 插入排序
直接插入排序
排序过程:整个排序过程为n-1趟插入,即先将序列 中第1个记录看成是一个有序子序列,然后从第2个记 录开始,逐个进行插入,直至整个序列有序 算法描述
42 70 85 ) 20
42 70 85 ) 20 j 42 70 85 ) 20 42 70 85 ) 20
42 70 85 ) 20
42 70 85 )
13 20 30 39
算法描述
算法评价
时间复杂度:T(n)=O(n² ) 空间复杂度:S(n)=O(1)
希尔排序(缩小增量法)
j j
j
j
ji
ij
ij
ij
i
i
i
二趟排序: 13 4 48 38 27 49 55 65 97 76
希尔排序特点
子序列的构成不是简单的“逐段分割”,而是将相隔某个增 量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n² 更小,而T(n)=O(n² ),所以T(n)从总体 上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1
27 49 65 97
Байду номын сангаас
50
76
65
49 13
输出:13
输出:13
97 38 50 13 输出:13 27 76 65 49 27 13 97
38 50
76 65 49 27 13 97
65 50
76 38 49 27
输出:13 27
输出:13 27 38
49 50 97 13 输出:13 27 38 76 38 65 27 13 50
第十章 排序
排序定义——将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫~ 排序分类
按待排序记录所在位置
内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序
按排序依据原则
插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序
76 65
50
76
97 13 49 38
65 27
97
49
38
27
输出:13 27 38 49
输出:13 27 38 49
97
65 65 76 50 49 38 97 27 13 输出:13 27 38 49 50 50 76 49
97 65
38 27
76
50 13 49 38
27
13 输出:13 27 38 49 50
13 38 27 38 13 38 30 27 38 30 49
13 27 30 38
13 27 30
49 27 13 49 30 27 49 30
65
76 第 二 趟
第 三 趟 第 四 趟 第 五 趟 第 六 趟
算法描述 算法评价
时间复杂度 最好情况(正序) 比较次数:n-1 移动次数:0 最坏情况(逆序) n 1 比较次数: (n i) 1 (n 2 n)
输出:13 27 38 49 50 65
76 97 50 49 38 65 27 13 输出:13 27 38 49 50 65 97 50
97 76
49 38
65
27
13
输出:13 27 38 49 50 65 76
76
50 13 49 38
65 27
输出:13 27 38 49 50 65 76 97
算法描述
第一个问题解决方法
方法:从无序序列的第n/2个元素(即此无序序列对应的完 全二叉树的最后一个非终端结点)起,至第一个元素止,进 行反复筛选
例 含8个元素的无序序列(49,38,65,97,76,13,27,50) 49 65 38 50 97 76 13 65 27 97 50 49
排序过程:先取一个正整数d1<n,把所有相隔d1的记 录放一组,组内进行直接插入排序;然后取d2<d1, 重复上述分组和排序操作;直至di=1,即所有记录放 进一个组中排序为止
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 一趟分组: 38 65 97 76 13 27 48 55 4
i 1
2
移动次数:3 (n i) 3 (n 2 n)
i 1
n
2
T(n)=O(n² ) 空间复杂度:S(n)=O(1)
快速排序
基本思想:通过一趟排序,将待排序记录分割成独立 的两部分,其中一部分记录的关键字均比另一部分记 录的关键字小,则可分别对这两部分记录进行排序, 以达到整个序列有序 排序过程:对r[s……t]中记录进行一趟快速排序,附 设两个指针i和j,设枢轴记录rp=r[s],x=rp.key
k
k
38 j
k
65 j
97 j
76 j
13 49 j
27 ] j
k
i=2 一趟: 13
[38 65 27 j
97 j 97 [97
76 j 76 76
49 38 ] 27 j 49 49 j 38 ] 65 ]
二趟: 13 三趟: 13
27 27
[65 38
四趟: 13
五趟: 13 六趟: 13 排序结束: 13
i
38
iij
j
65
49 (76
分别进行快速排序: ( 13) 27
(38) 49 (50
65)
76
(97)
快速排序结束:
13
27
38
49
50
65
76
97
算法描述
算法评价
时间复杂度 最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴) T(n)=O(n² ) T(n)=O(n² ) 空间复杂度:需栈空间以实现递归 最坏情况:S(n)=O(n) 一般情况:S(n)=O(log2n)
一趟排序:13 27 48 55 4 取d2=3 13 二趟分组: 27 48 55 4
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 三趟分组: 27 48 55 4
49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
§10.3 选择排序
简单选择排序
排序过程
首先通过n-1次关键字比较,从n个记录中找出关键字最小的 记录,将它与第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的 记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束
k 例 i=1 初始: [ 49 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 s i=8 20 (6 s i=8 20 (6
i=8 20 (6
i=8 20 (6
…... (6 13 30 39
13 30 39 m 13 30 39 j m 13 30 39 s mj 13 30 39 j s
27
27 27 27
38
38 38 38
49
49 49 49
[76
65 65 65
97
[97 76 76
65 ]
76 ] [97 ] 97