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

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.页
08.06.2020
10.1 概述
10.2 插入排序
10.3 快速排序
10.4 堆排序 10.5 归并排序
10.6 基数排序
10.7 各种排序方法的综合比较
08.06.2020
10.8 外.页 部排序
10.1 概 述
一、排序的定义 二、内部排序和外部排序 三、内部排序方法的分类
.页 08.06.2020
一般情况下, 假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn }
这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :
Kp1≤Kp2≤…≤Kpn
按此固有关系将上式记录序列重新排列为 { Rp1, Rp2, …,Rpn }
的操作称作排序。 .页
2.掌握各种排序方法的时间复杂度的分析方法。 能从"关键字间的比较次数"分析排序算法的平均情况 和最坏情况的时间性能。按平均时间复杂度划分,内 部排序可分为三类:O (n2) 的简单排序方法,O (n·logn) 的高效排序方法和O (d·n)的基数排序方法。
3.理解排序方法"稳定"或"不稳定"的含义,弄清 楚在什么情况下要求应用的.页排序方法必须是稳定的。
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97 .页 08.06.2020
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位置”
第十章 排序
.页 08.06.2020
【课前思考】
1. 你熟悉排序吗?你过去曾经学过哪些排序方法? 在第一章中曾以选择排序和起泡排序为例讨论算 法实践复杂度,不知你还记得吗? 2. 你自己有没有编过排序的程序?是用的什么策 略?
.页 08.06.2020
【学习目标】
1.理解排序的定义和各种排序方法的特点,并能 加以灵活应用。排序方法有不同的分类方法,基于"关 键字间的比较"进行排序的方法可以按排序过程所依据 的不同原则分为插入排序、交换排序、选择排序、归 并排序和计数排序等五类。
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key;
// 关键字项
InfoType otherinfo; // 其它数据项
} RcdType;
// 记录类型
typedef struct {
RcdType r[MAXSIZE+1]; // r[0]闲置
有序序列区 无 序 序 列 区
经过一趟排序
08.06.2020
有序序列区 无 序 序 列 区
.页
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
插入类 交换类 选择类
归并类 其它方法
.页 08.06.2020
#待de排fin记e M录A的XS数IZ据E 类10型00定// 义待排如顺下序:表最大长度
本章学习的要点主要是了解各种排序方法实现 时所依据的原则以及它们的主要操作(“关键字间 的比较”和“记录的移动”)的时间分析。学习中 应注意掌握各种排序方法实现的要点,可通过对基 础知识题中算法的手工执行和比较分析,切实掌握 各种排序过程的排序特点所在,注意同一排序方法 在不同的教科书上可以有不同书写形式描述的算法。 在学习本章过程中需练习的算法设计题为:10.23, 10.25,10.27 , 10.32, 10.34, 10.38, 10.42 和 10.45。
08.06.2020
二、内部排序和外部排序
若整个排序过程不需要访问外存便 能完成,则称此类排序问题为内部排 序;
反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题为外部排序。
.页 08.06.2020
三、内部排序的方法
内部排序的过程是一个逐步扩大 记录的有序序列长度的过程。
.页 08.06.2020
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它 加入到有序子序列中,以此方法增 加记录的有序子序列的长度。
.页 08.06.2020
4. 归并类
通过“归并”两个或两个以上的 记录有序子序列,逐步增加记录有 序序列的长度。
5. 其它方法
.页 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;
int
length;
// 顺序表长度
} SqList;
08.06.2020
.页 // 顺序表类型
1. 插入类
将无序子序列中的一个或几 个记录“插入”到有序序列中, 从而增加记录的有序子序列的长 度。
.页 08.06.2020
2. 交换类
通过“交换”无序序列中的记 录从而得到其中关键字最小或最大 的记录,并将它加入到有序子序列 中,以此方法增加记录的有序子序 列的长度。
2.将R[j+1..i-1]中的所有记录均后移
一个位置;
3.将R[i] 插入(复制)到R[j+1]的位置上。
.页 08.06.2020
不同的具体实现方法导致不同的算法描述
直接插入排序(基于顺序查找) 折半插入排序(基于折半查找) 表插入排序(基于链表存储) 希尔排序(基于逐趟缩小增量)
.页 08.06.2020
08.06.2020
【重点和难点】
希尔排序、快速排序、堆排序和归并排序等高效方 法是本章的学习重点和难点。
【知识点】
排序、直接插入排序、折Biblioteka Baidu插入排序、表插入排 序、希尔排序、起泡排序、快速排序、简单选择 排序、堆排序、2-路归并排序、基数排序、排序方 法的综合比较 。
.页 08.06.2020
【学习指南】
相关文档
最新文档