Download presentation
Presentation is loading. Please wait.
1
第5章 排序与查找 PART A 《可视化计算》
2
学习目标 如何在计算机中进行排序? 排序算法有那些分类? 如何实现常用的排序算法? 查找与排序有何关系? 查找算法有哪些分类?
如何实现常用的查找算法?
3
何为排序? 学习中的排序: 在一些教课书中,会将涉及到的所有术语排成索引,作为附录,方便读者在需要时查找
图书馆工作人员的重要工作,就是把归还的书,插入适当的书架、层次、位置, 方便读者查阅 社会中排序: 会议代表名单的排序(按姓氏笔画); 联大会议的发言顺序(按国家名称字母排序)
4
计算机如何进行排序? 从”混沌”到有序:排序自身也是一种应用,同时也为快速的查找提供必要的准备
在计算机科学中,排序(sorting)是研究最多的问题之一 基本排序算法有5类: 插入排序,例如,直接插入排序,二分插入排序等; 交换排序,例如,冒泡排序,快速排序等; 选择排序,例如,选择排序,推排序等 归并排序,例如,归并排序,多相归并排序等 分布排序,例如,桶排序,基数排序等
5
排序术语和实现策略 自然的(natural)
如果某种排序算法对有序的数据排序速度较快(工作量变小),对无序的数据排序速度却较慢(工作变量大),这种算法被称为自然排序算法 如果数据已接近有序,就需要考虑选用自然的排序算法
6
排序术语和实现策略 稳定的(stable) 如果能保持它认为相等的数据的前后顺序,这种算法被称为稳定排序算法
稳定的排序算法可按主、次关键字对数据进行排序,例如,按照姓氏和名字排序。 在具体实现时,就是先按主关键字排序,再按次关键字排序
7
排序术语和实现策略 内部排序和外部排序 待排数据全部在内存中的排序方法被称为内部排序,待排数据在磁盘、磁带和其它外存中的排序方法被称为外部排序 本节涉及的排序算法,全部针对内部排序进行讨论
8
排序术语和实现策略 关键字排序(Key sort)
如果要对某班级学生的期末成绩表进行排序,表中给出了每个学生的学号、姓名、单科成绩和总成绩等项目 按什么来排序?所选结果,就是关键字 本章所有案例中,只考虑关键字字段,而先将信息的其他内容一概略去
9
排序术语和实现策略 数字化排序(digitized sort)
在排序过程中,可以按数值大小排序,有时候需要按字符来排序,有时候需要按照时间的迟早来排序 实际上,计算机内的所有数据,无论属于哪种类型数据,都可以转换成数字(二进制或十进制)表达 所以排序本身可以抽象为对数字进行排序
10
如何在RAPTOR中实现排序 排序算法测试的数据来源 不仅可以节省用户与算法的交互时间 而且可以适当扩大数据集合,验证算法的效率
请回顾第2章提及的随机数生成和存储,以及使用文件输入数据的方法 不仅可以节省用户与算法的交互时间 而且可以适当扩大数据集合,验证算法的效率
11
直接插入排序 直接插入排序与整理扑克牌的过程非常类似 为了确定正确的插入位置,一般从左向右将摸上来的牌与手中已有的牌逐一比较
第1张牌没有必要整理 以后每次从牌堆(无序区)的最上面摸出1张牌并插入左手牌(有序区)中正确的位置上 为了确定正确的插入位置,一般从左向右将摸上来的牌与手中已有的牌逐一比较
12
直接插入排序 假设data.txt文件中存放着待排序的记录R[] ,则R[]可以看成是一个长度为n的待排数组
首先从data.txt文件中保存的数组R[]读入一个数据到a[1],生成一个有序数组 由于文件中的数组R[]呈无序状态,从i=2起至i=n为止,依次将R[i]插入当前的有序数组a[1..i-1]中 最后生成含n个记录的有序数组
13
插入排序main子图
14
插排look_for_position子图
15
插排move_to_new_position子图
16
桶排序 桶排序的思想源于信件分拣 在现实应用中,是把[0,1)的数值划分为n个大小相同的子区间,每一子区间可以看作是一个桶
由于同一桶内的记录其关键字不尽相同,所以必须采用关键字比较的排序方法(通常用插入排序)对每个桶进行排序 然后依次将各非空桶内的记录连接(收集)起来即可
18
桶排序main子图
19
桶排序的实现说明 简单的设计就是直接利用random()函数产生待排数据 很显然,这个算法离不开上一节介绍的插入排序
将随机数小数后的第一位为0~9的数字依次放入这10个桶内 很显然,这个算法离不开上一节介绍的插入排序 使用csv格式的文件保存已排序数据,可以留给其他的应用使用
20
桶排insert_sort_prepare子图 (I)
21
桶排insert_sort_prepare子图 (II)
22
桶排序的输出结果
23
冒泡排序 冒泡排序(Bubble Sort)的基本概念是:
将被排序的记录数组a[1..n]垂直排列,每个记录a[i]看作是重量为a[i]所存数值的气泡 根据轻气泡不能在重气泡之下的原则,从下往上扫描数组a[]:凡扫描到违反本原则的轻气泡,就使其向上"飘浮“ 如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止
25
冒泡排序main子图
26
冒泡算法说明 初始状态: a[1..n]为无序区。
第二次扫描:扫描a[2..n]。扫描完毕时,"次轻"的气泡飘浮到a[2]的位置上……。 最后,经过n-1 趟扫描可得到有序区a[1..n]
27
冒泡排序 bubble子图
28
冒泡算法如何改进? 假如待排序列已经是基本有序的(只有两个数字需要换位),如何能够在n-1趟之前,结束排序?
提示:可以将已经排好的数据,有意调换一对,然后使用改进后的算法实验(从文件读入待排数据)
29
快速排序 快速排序(Quick sort)是在冒泡排序基础上做了适当的改进 快速排序是由C. A. R. Hoare在1962年提出的
它采用了分治的策略,是一种划分交换排序算法 被誉为二十世纪“十大经典算法”之一
30
快速排序的基本思想 通过一趟排序将要排序的数据分割成独立的两部分 整个排序过程可以递归进行,从而使整个数据变为有序序列
其中一部分的所有数据都比另外一部分的所有数据要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行,从而使整个数据变为有序序列
32
快速排序main子图
33
快速排序QkSort子图
34
快速排序QkPass子图
35
RAPTOR中的快速排序 通过实际运行可知,这里实现的“快速排序”尽管可以改善排序算法的时间复杂性,但由于全局变量问题,实际上的空间复杂性很差 可以考虑使用非递归的实现来完成“快速排序”
36
归并排序 归并排序也叫合并排序是分治法一个非常典型的应用 归并排序法是将两个或更多个有序表合并成一个新的有序表
如果是将两个有序表合并成一个有序表,被称为2-路归并
38
归并排序main子图
39
归并排序input子图(I)
40
归并排序input子图(II)
41
归并算法实现的说明 待排的两路数据存放在一个文件中,文件中的头两个数据,分别是两路数据的个数(可以不等长);
在得到线形表的长度后,再用两个数组a[]、b[]保存待排数据 第一个排序循环过程是对两个数组的元素逐个进行比对,并输出较小的数据元素; 第二个循环过程是在比对输出完成后,仍有一个线形表的数据尚未输出完毕,所以再将有剩余元素的数组进行输出
42
归并排序merge子图(I)
43
归并排序merge子图(II)
44
排序算法的分析 冒泡排序显然最容易实现对已经存在的无序线形表进行排序,所以最为最常见; 插入排序对于随机产生的无序数据,可以实现实时排序;
归并排序的前提是存在两个以上已经排序的线形表; 桶排序则适用于可以进行分类的数据排序; 快速排序则是最能体现时间复杂性优化的排序算法,但要关注其在不同的实现环境中,可能因空间复杂性所带来的问题
45
排序算法的分析 稳定性分类 算法名称 时间复杂性 空间复杂性 稳定排序 冒泡排序 O(n^2) O(1) 插入排序 桶排序 O(n)
O(k) 空间 合并排序 O(nlogn) O(n) 空间 不稳定排序 快速排序 最坏O(n^2)
46
End of ch5-1
Similar presentations