- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
第十章 内部排序
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
2
10.1 概述
1、排序是计算机内经常进行的一种操作,其目的是将一 组“无序”的记录序列调整为“按关键字有序”的记录序 列。 52,49,80,36,14,58,61,23,97,75
例1:关键字序列T=(13,6,3,31,9,27,5,11),
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11 【6, 13】, 3, 31, 9, 27, 5, 11 【3, 6, 13】, 31, 9, 27, 5, 11 【3, 6, 13,31】, 9, 27, 5, 11 【3, 6, 9, 13,31】, 27, 5, 11 【3, 6, 9, 13,27, 31】, 5, 11 【3, 5, 6, 9, 13,27, 31】, 11 【3, 5, 6, 9, 11,13,27, 31】
d=关键字的位数(长度)
8
9.2 插入排序
插入排序的基本思想是:每步将一个待排序的对象, 按其关键码大小,插入到前面已经排好序的一组对象 的适当位置上,直到对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的。
插入排序有多种具体实现算法: 1) 直接插入排序 2) 折半插入排序 3) 希尔排序
3
2、关键字
数据对象有多个属性域,即多个数据成员组成,其中有一个 属性域可以用来区分对象,作为排序依据,称为关键字。
关键字与记录之间是一对一的关系 称主关键字 关键字与记录之间是一对多的关系 称次关键字
4
3、排序的目的是什么?
—— 便于查找
4、排序算法的好坏如何衡量?
❖ 时间效率 —— 排序速度(即排序所花费的全部比较次数) ❖ 空间效率 —— 占内存辅助空间的大小 ❖ 稳定性 —— 若两个记录A和B的关键字相等,但排序后A,
6
6、排序主要做的工作: 比较 + 移动
7
7. 内部排序的算法有哪些?
——按排序的规则不同,可分为5类: • 插入排序 • 交换排序(重点是快速排序) • 选择排序 • 归并排序 • 基数排序
——按排序算法的时间复杂度不同,可分为3类: •简单的排序算法:时间效率低,O(n2) •先进的排序算法: 时间效率高,O( nlog2n ) •基数排序算算法:时间效率高,O( d×n)
时间效率:虽然比较次数大大减少,可惜移动次数并未减少, 所以排序效率仍为O(n2) 。
空间效率: O(1) 稳定性:稳定
对应程序见教材P267(仅用于顺序表) 讨论:若记录是链表结构,用直接插入排序行否?折半插入排
序呢? 答:直接插入不仅可行,而且还无需移动元素,时间效率更高!
但链表无法“折半”!
12
14,23,36,49,52,58,61,75,80,97
一般情况下, 假设含n个记录的序列为{R1,R2,……,Rn} 其相应的关键字序列为 {K1,K2,……,Kn} 这些关键字相互之间可以进行比较, 即在它们之间存在这样一个关系:Kp1<=Kp2<=…<=Kpn 按此固有关系将上式记录序列重新排列为{Rp1,Rp2,…,Rpn} 的操作称作排序
B的先后次序保持不变,则称这种排序算法是稳定的。
5
5、什么叫内部排序?什么叫外部排序
内部排序和外部排序的不同在于能否一次处 理完所有数据
—— 若待排序记录都在内存中,称内部排序 —— 若待排序记录一部分在内存,一部分在外存,则称为外 部排序。 注:外部排序时,要将数据分批调入内存来排序,中间结果 还要及时放入内存,显然外部排序要复杂得的多。
10
– 例题 对下列存放在数组A中的序列采用直接插 入排序法排序。
A[0]
49 38 65
A[1] A[2] A[3]
97
A[4]
76
A[5]
13 27 49
A[6] A[7] A[8]
2347178963 413938 33248879 4695 76946579 74966975 179367 297 49
9
1) 直接插入排序
最简单的排序法!
新元素插入到哪里? 在已形成的有序表中线性查找,并在
适当位置插入,把原来位置上的元素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11),
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11 【6, 13】, 3, 31, 9, 27, 5, 11 【3, 6, 13】, 31, 9, 27, 5, 11 【3, 6, 13,31】, 9, 27, 5, 11 【3, 6, 9, 13,31】, 27, 5, 11 【3, 6, 9, 13,27, 31】, 5, 11 【3, 5, 6, 9, 13,27, 31】, 11 【3, 5, 6, 9, 11,13,27, 31】
14
3)希尔(shell)排序(又称缩小增量排序)
基本思想:先将整个待排记录序列分割成若干子序列,分 别进行直接插入排序,待整个序列中的记录“基本有序” 时,再对全体记录进行一次直接插入排序。 技巧:子序列的构成不是简单地“逐段分割”,而是将 相隔某个增量dk的记录组成一个子序列,让增量dk逐趟 缩短(例如依次取5,3,1),直到dk=1为止。 优点:让关键字值小的元素能很快前移,且序列若基本 有序时,再用直接插入排序处理,时间效率会高很多。
监视哨
待排元素待排元素待排元素待排元素待排元素待排元素待排元素
第 1234567 趟插入排序 排序趟数=数据个数-1 注 紫色 表示待排数据;蓝色 表示已经有序数据
11
2) 折半插入排序
新元素插入到哪里?在已形成的有序表中折半查找,并在适 当位置插入,把原来位置上的元素向后顺移。
优点:比较的次数大大减少,全部元素比较次数仅为 O(nlog2n)。
13
例:有6个记录,前5 个已排序的基础上,对第6个记录排序。 [ 15 27 36 53 69 ] 42
low
mid
( 42>36 )
[ 15 27 36 53
high
69 ] 42
[ 15 27 36
low high mid ( 42<53 )
53 69 ] 42
[ 15 27 36 42 53 69 ]