第八章排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内排序方法很多,按照排序中所用策略的不同,它一般可分为五类:插 入排序、选择排序、交换排序、归并排序和基数排序。每一类中不同的排序 算法都是基于同一策略的不同方法。外部排序多是采用多路归并方法进行排 序。
本章仅讨论各种内部排序的方法
比较排序算法的优劣标准
时间复杂度 是衡量排序算法好坏的最重要的标准。
排序的时间性能取决于排序过程中这两个操作的次数。 从直接插入排序的算法可见,这两个操作的次数取决于待 排记录序列的状态,当待排记录处于"正序"(即记录按关 键字从小到大的顺序排列)的情况时,所需进行的关键字比 较和记录移动的次数最少,反之,当待排记录处于"逆序 "(即记录按关键字从大到小的顺序排列)的情况时,所需进 行的关键字比较和记录移动的次数最多,如下表所列:
使用key代表抽象的关键字。
关键字分为主关键字和次关键字两种。
主关键字是能够唯一地区分各个不同数据 元素的关键字。例如学号。
不满足主关键字定义的关键字为次关键字。 例如血色和那个的成绩。
排序的定义
假设含有n条记录的序列为 { R1,R2,...Rn} 其相应的关键字序列为{ K1,K2,…Kn}, 排序就是将此n条记录按照关键字值的大小递增或递 减方式对这些记录进行排列,使这些记录由无序变 为有序的一种操作,即排序后得到的序列若为
LineList tmp;
for (i=1;i<n;i++)
{
tmp=R[i];
j=i-1;
while (j>=0 && tmp.key<R[j].key)
{
tmp*/
R[j+1]=R[j]; /*元素后移,以便腾出一个位置插入
j--;
}
R[j+1]=tmp;
/*在j+1位置处插入tmp*/
}}
时间复杂度
如果在待排序的记录中,存在有多个关键字相同的记 录(如Ri和Rj的关键字相同,即Ki =Kj) 。
若在排序操作之前,Ri在Rj之前,若采用某种排序方 法进行排序之后,这些具有相同关键字的记录如Ri和Rj其 相对次序保持不变即Ri仍在Rj之前,此时称这种排序方法 为稳定排序。
相反,若在排序后的序列中Ri与Rj的相对次序发生变 化即Ri在Rj之后,此时称这种排序方法是不稳定的。
i=3 (22) [13 22 38] 97 76 65 38` 58
i=4 (97) [13 22 38 97]76 65 38` 58
i=5 (76) [13 22 38 76 97] 65 38` 58
i=6 (65) [13 22 38 65 76 97] 38` 58
i=7 (38') [13 22 38 38` 65 76 97] 58
空间复杂度 是衡量排序算法好坏的重要的标准。 为避免内存考虑不周,造成应用软件运行失
败,Leabharlann Baidu常考虑最坏的情况。
比较排序算法的优劣标准
稳定性 是衡量排序算法好坏的重要的标准。
当使用主关键字排序时,任何排序的 算法结果都是一致的。但使用次关键字排 序时,其结果可能相同,可能不同。
稳定排序与不稳定排序
排序问题就是把若干个数据元素排成 一个有序序列,因此排序问题的数据元素 集合是线性结构。
这和第二章讨论的线性表基本吻合。 所以排序问题的数据结构是线性表。或者 说,排序是线性表操作集合中的又一个操 作。只是因为排序操作比较重要,而且方 法很多,所以专设一章讨论。
任何算法的实现方法都和算法所处理 的数据元素的存储结构有关,线性表的存 储结构有使用数组的顺序表和使用指针的 链表两种。
i=8 (58) [13 38 22 38` 58 65 76 97]
监视哨 R[0] 注:在图中,i表示插入的次数,方括号中的数据表示已排好序的记录所对应的关键字。
图8.1 直接插入排序过程
代码---直接插入排序函数
void InsertSort(LineList R[],int n)
{
int i,j;
{Ri1,Ri2,…,Rin} 则其对应的关键字值满足
Ki1≤Ki2≤,…,≤Kin 或 Ki1≥Ki2≥,…,≥Kin
排序的分类
内排序与外部排序
可根据记录所处的环境即按照排序过程中所使用的内、外存情况的不同, 将排序分为内排序和外排序两大类别。若利用某一种排序方法在排序过程中 全部数据都存放在内存中即排序时没有进行内、外存数据交换,则称这种排 序方法为内排序;若排序过程中全部记录不能同时存放在内存,需要进行数 据的内、外存交换,则称这种排序方法为外排序。显然,内排序适用于一些 记录数目不很多的文件。对于一些较大的文件,由于内存容量的限制,不能 一次全部装入内存进行排序,也只得采用外排序来实现,但是外排序的速度 要比内排序速度慢得多。
直接插入排序
基本思想 顺序地把待排序的数据按其关键字值
的大小插入到已排序的子集的适当位置。 子集的数据元素个数从只有一个数据元素 开始,逐次增大,当子集大小和集合大小 相同时,排序完毕。
实例
[初始关键字] [13] 38 22 97 76 65 38` 58 i=2 (38) [13 38] 22 97 76 65 38` 58
直接插入排序 插入排序 希尔排序
内排序方法
起泡排序 选择排序
快速排序
简单选择排序 交换排序 堆排序
归并排序 基数排序
多关键码排序 链式基数排序
在排序的过程中需进行的基本操作
比较两个关键字的大小; 将记录从一个位置移动至另一个位置。
1、插入排序
基本思想 从初始的有序的子集开始,不断地把
新的数据元素插入到有序子集的适当位置, 使子集中数据元素个数不断增多,当子集 等于集合时,插入排序算法结束。
第八章 排序
概述
排序在日常生活中是屡见不鲜的。例如,学生成绩的 排名,人事管理部门对职工的排列、运动项目中运动员的 排名等,这些均属于排序的例子,排序的目的是便于以后 检索其成员,例如,电话号码簿、目录表、图书馆、字词 典等一切需对所存对象进行检索的地方,都要先将对象加 以排序。
排序是数据处理中的一种重要运算,如何进行排序, 特别是高效率地进行排序是程序设计中所要研究的重要问 题之一。
因为数组具有随机存取特性,时间复 杂度为0(1);而链表不具有随机存取的特性, 时间复杂度为o(n)。所以,排序算法主要是 基于顺序表(或者说基于数组)设计的。
基本概念
关键字 关键字是数据元素中的一个数据项,排序是
以关键字为基准进行的。 例如:在学生成绩表中,既可以按照学号来
排序,也可以按照某一科目的成绩排序。 为了不失一般性,在本章讨论算法的时候,
本章仅讨论各种内部排序的方法
比较排序算法的优劣标准
时间复杂度 是衡量排序算法好坏的最重要的标准。
排序的时间性能取决于排序过程中这两个操作的次数。 从直接插入排序的算法可见,这两个操作的次数取决于待 排记录序列的状态,当待排记录处于"正序"(即记录按关 键字从小到大的顺序排列)的情况时,所需进行的关键字比 较和记录移动的次数最少,反之,当待排记录处于"逆序 "(即记录按关键字从大到小的顺序排列)的情况时,所需进 行的关键字比较和记录移动的次数最多,如下表所列:
使用key代表抽象的关键字。
关键字分为主关键字和次关键字两种。
主关键字是能够唯一地区分各个不同数据 元素的关键字。例如学号。
不满足主关键字定义的关键字为次关键字。 例如血色和那个的成绩。
排序的定义
假设含有n条记录的序列为 { R1,R2,...Rn} 其相应的关键字序列为{ K1,K2,…Kn}, 排序就是将此n条记录按照关键字值的大小递增或递 减方式对这些记录进行排列,使这些记录由无序变 为有序的一种操作,即排序后得到的序列若为
LineList tmp;
for (i=1;i<n;i++)
{
tmp=R[i];
j=i-1;
while (j>=0 && tmp.key<R[j].key)
{
tmp*/
R[j+1]=R[j]; /*元素后移,以便腾出一个位置插入
j--;
}
R[j+1]=tmp;
/*在j+1位置处插入tmp*/
}}
时间复杂度
如果在待排序的记录中,存在有多个关键字相同的记 录(如Ri和Rj的关键字相同,即Ki =Kj) 。
若在排序操作之前,Ri在Rj之前,若采用某种排序方 法进行排序之后,这些具有相同关键字的记录如Ri和Rj其 相对次序保持不变即Ri仍在Rj之前,此时称这种排序方法 为稳定排序。
相反,若在排序后的序列中Ri与Rj的相对次序发生变 化即Ri在Rj之后,此时称这种排序方法是不稳定的。
i=3 (22) [13 22 38] 97 76 65 38` 58
i=4 (97) [13 22 38 97]76 65 38` 58
i=5 (76) [13 22 38 76 97] 65 38` 58
i=6 (65) [13 22 38 65 76 97] 38` 58
i=7 (38') [13 22 38 38` 65 76 97] 58
空间复杂度 是衡量排序算法好坏的重要的标准。 为避免内存考虑不周,造成应用软件运行失
败,Leabharlann Baidu常考虑最坏的情况。
比较排序算法的优劣标准
稳定性 是衡量排序算法好坏的重要的标准。
当使用主关键字排序时,任何排序的 算法结果都是一致的。但使用次关键字排 序时,其结果可能相同,可能不同。
稳定排序与不稳定排序
排序问题就是把若干个数据元素排成 一个有序序列,因此排序问题的数据元素 集合是线性结构。
这和第二章讨论的线性表基本吻合。 所以排序问题的数据结构是线性表。或者 说,排序是线性表操作集合中的又一个操 作。只是因为排序操作比较重要,而且方 法很多,所以专设一章讨论。
任何算法的实现方法都和算法所处理 的数据元素的存储结构有关,线性表的存 储结构有使用数组的顺序表和使用指针的 链表两种。
i=8 (58) [13 38 22 38` 58 65 76 97]
监视哨 R[0] 注:在图中,i表示插入的次数,方括号中的数据表示已排好序的记录所对应的关键字。
图8.1 直接插入排序过程
代码---直接插入排序函数
void InsertSort(LineList R[],int n)
{
int i,j;
{Ri1,Ri2,…,Rin} 则其对应的关键字值满足
Ki1≤Ki2≤,…,≤Kin 或 Ki1≥Ki2≥,…,≥Kin
排序的分类
内排序与外部排序
可根据记录所处的环境即按照排序过程中所使用的内、外存情况的不同, 将排序分为内排序和外排序两大类别。若利用某一种排序方法在排序过程中 全部数据都存放在内存中即排序时没有进行内、外存数据交换,则称这种排 序方法为内排序;若排序过程中全部记录不能同时存放在内存,需要进行数 据的内、外存交换,则称这种排序方法为外排序。显然,内排序适用于一些 记录数目不很多的文件。对于一些较大的文件,由于内存容量的限制,不能 一次全部装入内存进行排序,也只得采用外排序来实现,但是外排序的速度 要比内排序速度慢得多。
直接插入排序
基本思想 顺序地把待排序的数据按其关键字值
的大小插入到已排序的子集的适当位置。 子集的数据元素个数从只有一个数据元素 开始,逐次增大,当子集大小和集合大小 相同时,排序完毕。
实例
[初始关键字] [13] 38 22 97 76 65 38` 58 i=2 (38) [13 38] 22 97 76 65 38` 58
直接插入排序 插入排序 希尔排序
内排序方法
起泡排序 选择排序
快速排序
简单选择排序 交换排序 堆排序
归并排序 基数排序
多关键码排序 链式基数排序
在排序的过程中需进行的基本操作
比较两个关键字的大小; 将记录从一个位置移动至另一个位置。
1、插入排序
基本思想 从初始的有序的子集开始,不断地把
新的数据元素插入到有序子集的适当位置, 使子集中数据元素个数不断增多,当子集 等于集合时,插入排序算法结束。
第八章 排序
概述
排序在日常生活中是屡见不鲜的。例如,学生成绩的 排名,人事管理部门对职工的排列、运动项目中运动员的 排名等,这些均属于排序的例子,排序的目的是便于以后 检索其成员,例如,电话号码簿、目录表、图书馆、字词 典等一切需对所存对象进行检索的地方,都要先将对象加 以排序。
排序是数据处理中的一种重要运算,如何进行排序, 特别是高效率地进行排序是程序设计中所要研究的重要问 题之一。
因为数组具有随机存取特性,时间复 杂度为0(1);而链表不具有随机存取的特性, 时间复杂度为o(n)。所以,排序算法主要是 基于顺序表(或者说基于数组)设计的。
基本概念
关键字 关键字是数据元素中的一个数据项,排序是
以关键字为基准进行的。 例如:在学生成绩表中,既可以按照学号来
排序,也可以按照某一科目的成绩排序。 为了不失一般性,在本章讨论算法的时候,