数据结构第9章排序

合集下载

数据结构第九章

数据结构第九章
KCN i n(n 1) / 2 n 2 / 2, RMN (i 2) (n 4)(n 1) / 2 n 2 / 2
i 1 i 1 n 1 n 1
140-14


平均情况下排序的时间复杂度为 o(n2)。 直接插入排序是一种稳定的排序方法。
折半插入排序 (Binary Insertsort)

基本思想是 : 设在顺序表中有一 个元素序列 V[0], V[1], …, V[n-1]。其中, V[0], V[1], …, V[i-1] 是已经排好序的元素。在插入V[i] 时, 利 用折半搜索法寻找V[i] 的插入位置。
折半插入排序的算法
#include "dataList.h"
140-15
插入排序 (Insert Sorting)

基本方法是:每步将一个待排序的元素,按其 排序码大小,插入到前面已经排好序的一组元 素的适当位置上, 直到元素全部插入为止。
直接插入排序 (Insert Sort)

基本思想是 : 当插入第i (i≥1) 个元素时,前面 的V[0], V[1], …, V[i-1]已经排好序。这时,用 V[i]的排序码与V[i-1], V[i-2], …的排序码顺序 进行比较,插入位置即将V[i]插入,原来位置 上的元素向后顺移。
140-11
直接插入排序的算法
#include "dataList.h" template <class T> void InsertSort (dataList<T>& L, int left, int right) { //依次将元素L.Vector[i]按其排序码插入到有序表 //L.Vector[left],…,L.Vector[i-1]中,使得 //L.Vector[left]到L.Vector[i]有序。 Element<T> temp; int i, j; for (i = left+1; i <= right; i++) if (L[i] < L[i-1]) { temp = L[i]; j = i-1;

中国农业大学_821数据结构_《数据结构》习题(9)

中国农业大学_821数据结构_《数据结构》习题(9)

第9章内部排序一、问答题1. 什么是内部排序?什么是排序方法的稳定性?2. 对于本章介绍的内部排序方法,哪几种是稳定的?哪几种是不稳定的?对不稳定的排序方法试举例说明。

3. 对于给定的一组记录的关键字:23,13,17,21,30,60,58,28,30,90。

试分别写出用下列排序方法对其进行排序时,每一趟排序后的结果:(1)直接插入排序;(2)希尔排序;(3)冒泡排序;(4)直接选择排序;(5)快速排序(6)堆排序(7)归并排序。

4. 对长度为n的记录序列进行快速排序时,所需要的比较次数依赖于这n个元素的初始序列。

(1)n = 8时,在最好的情况下需要进行多少次比较?试说明理由。

(2)给出n = 8时的一个最好情况的初始排列实例。

5 试为下列各种情况选择合适的排序方法:(1)n = 30,要求在最坏的情况下,排序速度最快;(2)n = 30,要求排序速度既要快,又要排序稳定。

6. 判别以下序列是否为堆(所有的非叶子结点的关键字值k i均不大于其左右两个分支结点的关键字值k2和k2i+1。

),如果不是,则把它调整为堆。

(1)( 100, 86, 48, 73, 35, 39, 42, 57, 66, 21 );(2)( 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 );(3)( 103, 97, 56, 38, 66, 23, 42, 12, 30, 52, 06, 20 );(4) ( 05, 56, 20, 03, 23, 40, 38, 29, 61, 05, 76, 28, 100 )。

7. 一组待排序记录的关键字是:986,321,123,432,500,654,018,765,987,210。

按照LSD方法写出基数排序的过程和结果。

8. 试证明:如果对于一个长度为n的任意文件进行排序,则至少需进行nlog2n次比较。

9. 试构造对5个整数元素进行排序,最多只用7次比较的算法思想。

数据结构第九章排序习题与答案

数据结构第九章排序习题与答案

习题九排序一、单项选择题1.下列内部排序算法中:A.快速排序 B.直接插入排序C. 二路归并排序D.简单选择排序E. 起泡排序F.堆排序(1)其比较次数与序列初态无关的算法是()(2)不稳定的排序算法是()(3)在初始序列已基本有序(除去n 个元素中的某 k 个元素后即呈有序, k<<n)的情况下,排序效率最高的算法是()(4)排序的平均时间复杂度为O(n?logn)的算法是()为 O(n?n) 的算法是()2.比较次数与排序的初始状态无关的排序方法是( )。

A.直接插入排序B.起泡排序C.快速排序D.简单选择排序3.对一组数据( 84, 47, 25, 15, 21)排序,数据的排列次序在排序的过程中的变化为(1) 84 47 25 15 21(2) 15 47 25 84 21(3) 15 21 25 84 47(4) 15 21 25 47 84则采用的排序是 ()。

A. 选择B.冒泡C.快速D.插入4.下列排序算法中 ( )排序在一趟结束后不一定能选出一个元素放在其最终位置上。

A. 选择B.冒泡C.归并D.堆5.一组记录的关键码为(46,79,56, 38,40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。

A. (38,40,46,56,79,84) B. (40,38,46,79,56,84)C. (40,38,46,56,79,84) D. (40,38,46,84,56,79)6.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是()排序。

A.冒泡 B. 希尔C. 快速D. 堆7.就平均性能而言,目前最好的内排序方法是() 排序法。

A. 冒泡B.希尔插入C.交换D.快速8.下列排序算法中,占用辅助空间最多的是:()A. 归并排序B.快速排序C.希尔排序D.堆排序9.若用冒泡排序方法对序列 {10,14,26,29,41,52}从大到小排序,需进行()次比较。

冒泡排序PPT课件

冒泡排序PPT课件
16
小结:
本节课主要学习了冒泡排序的基本原理及 其算法流程图。其中数组和双循环是我们本 节课使用较多的一种结构。
应用到本节知识的实例有很多,比如:打 印九九乘法口诀表、彩票数字选择器、工作 表安排等等。
17
课后作业:
在刚才的冒泡排序中是否一定要进行7趟? 针对这个问题你有什么好的方法对我们的 算法再进行优化?
第二趟排序的步骤: 序号 1 2 3 4 5 6 7 8 数据 38 49 65 7163 172367 274769 4796 97
38<494,保9<持65不,6保变5<持7不67,6变保>1持3不,7交6变>换27位, 置交76换7>64位<99置,7交, 保换持位不置变 经过第二趟排序,实把现第了二什大么的目数的沉?到倒数第二个位置了!
(2)冒泡的流程图 主要采用讲解法
(3)冒泡的算法优化问题 主要采用课堂讨论和提问的方式
(4)冒泡的知识点扩展 采用课堂演示的方法
(5)小结
26
3、作业布置
在讲解的冒泡排序算法的基础上,思考进一 步的优化算法。加深学生对知识的掌握和理解。
27
28
序号 1 2 3 4 5 6 7 8 数据 38 49 65 13 27 49 76 97
我们知道经过第一趟的排序之后,最大的一个数 已经排到最后了这样在进行第二趟排序时有没有必要 再对第7、8个数据再进行排序呢?
15
扩展:
冒泡排序也可以从后往前进行,过程演 示如下:
45 34 78 12 34’ 32 29 64
分析:

开始 R[1]>R[2]
第一步做什么? 否
t:=R[1] R[1]:=R[2]

计算机专业数据结构第九章测试

计算机专业数据结构第九章测试

数据结构测试(长春理工大学精品课)第9章排序一、选择题1.某内排序方法的稳定性是指( )。

查看答案A.该排序算法不允许有相同的关键字记录B.该排序算法允许有相同的关键字记录C.平均时间为0(n log n)的排序方法D.以上都不对正确答案是D解释:稳定的排序方法指的是若有相同关键字的记录,待排序时在前面的记录排序后仍然排在前面的排序方法。

收起2.下面给出的四种排序法中( )排序法是不稳定性排序法。

查看答案A. 插入B. 冒泡C. 二路归并D. 堆正确答案是D解释:堆排序是不稳定的,交换时有可能把后面的排在前面。

收起3.下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是。

( )查看答案A.选择排序法 B. 插入排序法 C. 快速排序法 D. 堆排序法正确答案是A解释:简单选择排序是在待排记录中找到最小的和第一个相交换,再在除了第一个排完的以外找个最小的和第二个相交换,依此类推,n个记录的待排序列需要比较(n-1)+(n-2)+......+0=(n-1)*n/2收起4. 对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4,8,20,9,7}则该次采用的增量是查看答案( )A. lB. 4C. 3D. 2正确答案是B 收起5.下列四个序列中,哪一个是堆()。

查看答案A. 75,65,30,15,25,45,20,10B. 75,65,45,10,30,25,20,15C. 75,45,65,30,15,25,20,10D. 75,45,65,10,25,30,20,15正确答案是C解释:这是一个大根堆,每个结点都比左右孩子小。

收起6.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中的变化为(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47(4)15 21 25 47 84则采用的排序是( )。

数据结构第9章 排序

数据结构第9章 排序

R[3] 10
R[4] 60
R[5] 25
R[6] 30
R[7] 18 18 18 18
18 36 20

10 10 36
60 60 60
25 25 25
30 30 30
【算法】直接插入排序 void D_InsertSort(datatype R[ ], int n) { /*对排序表R[1]..R[n]进行直接插入排序,n是记录的 个数*/ for(i=2; i<=n; i++) if (R[i].key<R[i-1].key) {R[0]=R[i]; /*将R[i]插入R[1].. R[i-1]中, R[0]为监测哨*/ for(j=i-1; R[0].key<R[j].key; j--) R[j+1]=R[j]; /*后移记录*/ R[j+1]=R[0]; /*插入到合适位置*/ } }
空间性能:除排序表以外的内存占用情况。 时间性能:比较关键码的次数,数据移动的次数。 它们往往是排序表规模(n)的函数
6. 记录和排序表的数据结构
一般采用顺序结构存储排序表。 记录和排序表的类型定义如下: #define MAXNUM … /* MAXNUM 为足够大的数 typedef struct { keytype key; …… } datatype; datatype R[MAXNUM]; /*关键码字段*/ /*其它信息*/ /*记录类型*/ /*定义排序表的存储
第一趟排序结果,使得间隔为5的字表有序: P=3
29 7 41 30 11 39 50 76 41 13 10 0 80 78 86
子序列分别为:{29,30,50,13,78},{7,11,76,100,86}, {41,39,41,80}。第二趟排序结果: P=1

数据结构第9章 排序

数据结构第9章 排序

数据结构第9章排序数据结构第9章排序第9章排名本章主要内容:1、插入类排序算法2、交换类排序算法3、选择类排序算法4、归并类排序算法5、基数类排序算法本章重点难点1、希尔排序2、快速排序3、堆排序4.合并排序9.1基本概念1.关键字可以标识数据元素的数据项。

如果一个数据项可以唯一地标识一个数据元素,那么它被称为主关键字;否则,它被称为次要关键字。

2.排序是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。

如果排序依据的是主关键字,排序的结果将是唯一的。

3.排序算法的稳定性如果要排序的记录序列中多个数据元素的关键字值相同,且排序后这些数据元素的相对顺序保持不变,则称排序算法稳定,否则称为不稳定。

4.内部排序与外部排序根据在排序过程中待排序的所有数据元素是否全部被放置在内存中,可将排序方法分为内部排序和外部排序两大类。

内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将一部分数据元素放在内存中,另一部分放在外围设备上。

整个排序过程需要在内存和外存之间进行多次数据交换才能得到排序结果。

本章仅讨论常用的内部排序方法。

5.排序的基本方法内部排序主要有5种方法:插入、交换、选择、归并和基数。

6.排序算法的效率评估排序算法的效率主要有两点:第一,在一定数据量的情况下,算法执行所消耗的平均时间。

对于排序操作,时间主要用于关键字之间的比较和数据元素的移动。

因此,我们可以认为一个有效的排序算法应该是尽可能少的比较和数据元素移动;第二个是执行算法所需的辅助存储空间。

辅助存储空间是指在一定数据量的情况下,除了要排序的数据元素所占用的存储空间外,执行算法所需的存储空间。

理想的空间效率是,算法执行期间所需的辅助空间与要排序的数据量无关。

7.待排序记录序列的存储结构待排序记录序列可以用顺序存储结构和和链式存储结构表示。

在本章的讨论中(除基数排序外),我们将待排序的记录序列用顺序存储结构表示,即用一维数组实现。

清华大学课程讲义-数据结构答案第9章

清华大学课程讲义-数据结构答案第9章

清华大学课程讲义-数据结构答案第9章9-1 什么是内排序? 什么是外排序? 什么排序方法是稳定的? 什么排序方法是不稳定的? 【解答】9-2 设待排序的关键码序列为{12, 2, 16, 30, 28, 10, 16*, 20, 6, 18}, 试分别写出使用以下排序方法每趟排序后的结果。

并说明做了多少次关键码比较。

(1) 直接插入排序(2) 希尔排序(增量为5,2,1) (3) 起泡排序(4) 快速排序(5) 直接选择排序(6) 锦标赛排序(7) 堆排序(8) 二路归并排序(9) 基数排序【解答】9-3 在起泡排序过程中,什么情况下关键码会朝向与排序相反的方向移动,试举例说明。

在快速排序过程中有这种现象吗?【解答】如果在待排序序列的后面的若干关键码比前面的关键码小,则在起泡排序的过程中,关键码可能向与最终它应移向的位置相反的方向移动。

例如,57 40 38 11 13 34 48 75 6 19 9 7 如9向相反方向移动6 57 40 38 11 13 34 48 75 7 19 9 如19向相反方向移动6 7 57 40 38 11 13 34 48 75 9 19 如9向最终方向移动6 7 9 57 40 38 11 13 34 48 75 19 如13向相反方向移动6 7 9 11 57 40 38 13 19 34 48 75 如13向最终方向移动6 7 9 11 13 57 40 38 19 34 48 75 如34向相反方向移动6 7 9 11 13 19 57 40 38 34 48 756 7 9 11 13 19 34 57 40 38 48 756 7 9 11 13 19 349-4 试修改起泡排序算法,在正反两个方向交替进行扫描,即第一趟把关键码最大的对象放到序列的最后,第二趟把关键码最小的对象放到序列的最前面。

如此反复进行。

【解答】template <class Type> void dataList<Type> :: shake_Sort ( ) {//奇数趟对表Vector从前向后, 比较相邻的关键码, 遇到逆序即交换, 直到把参加比较关键码序列//中最大的关键码移到序列尾部。

北京师范大学数据结构教学资料第九章排序

北京师范大学数据结构教学资料第九章排序

第九章排序(基础知识)8.1 【答案】以关键字序列(265,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下排序算法的各趟排序结束时,关键字序列的状态。

(1) 直接插入排序(2)希尔排序(3)冒泡排序(4)快速排序(5) 直接选择排序(6) 堆排序(7) 归并排序(8)基数排序上述方法中,哪些是稳定的排序?哪些是非稳定的排序?对不稳定的排序试举出一个不稳定的实例。

8.2 【答案】上题的排序方法中,哪些易于在链表(包括各种单、双、循环链表)上实现?8.3 【答案】当R[low..high]中的关键字均相同时,Partion返回值是什么?此时快速排序的的运行时间是多少?能否修改Partion,使得划分结果是平衡的(即划分后左右区间的长度大致相等)?8.4 【答案】若文件初态是反序的,则直接插入,直接选择和冒泡排序哪一个更好?8.5 【答案】若文件初态是反序的,且要求输入稳定,则在直接插入、直接选择、冒泡和快速排序中就选选哪种方法为宜?6. 用快速排序算法,对下列数组排序60 56 65 99 22 16 88 100a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]取a[0]为支点(pivot),列出第一轮升序排序后的元素顺序。

8.6 【答案】有序数组是堆吗?8.7 【答案】高度为h的堆中,最多有多少个元素?最少有多少个元素?在大根堆中,关键字最小的元素可能存放在堆的哪些地方?8.8 【答案】判别下列序列是否为堆(小根堆或大根堆),若不是,则将其调整为堆:(1) (100,86,73,35,39,42,57,66,21);(2) (12,70,33,65,24,56,48,92,86,33);(3) (103,97,56,38,66,23,42,12,30,52,06,20);(4) (05,56,20,23,40,38,29,61,35,76,28,100).8.9 【答案】将两个长度为n的有序表归并为一个长度为2n的有序表,最小需要比较n次,最多需要比较2n-1次,请说明这两种情况发生时,两个被归并的表有何特征?7. 将序列101 45 21 532 22 5 232 14 存放在一静态链表中(见下图),并对其按照链式基数排序法进行升序排序。

第9章排序(下)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社

第9章排序(下)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社



5(-∞)
17
5
10

F0
F1
F2
F3 29 F4 15
每个叶子结点对应一个归并段,段号为0~4。 初始时每个分支结点(含冠军结点)取值“5(- ∞)”,5表示段 号(此时为虚拟段号),- ∞表示最小关键字。例如,某结点取值 为“4(15)”,表示结点值来自4号段的关键字15对应的记录。
15(5-)∞) 冠军(最小者)
9.7
1. k路平衡归并的效率分析
k=2时,采用平衡归并时,如果初始归并段有m个,那么这样的归
并树就有log2m+1层。
外 排
要对数据进行log2m趟扫描。

说明:如果所有初始归并段的长度(初始归并段中的记录个
数)相等或大致相等,可采用k路平衡归并。
9.7
例如:二路平衡归并 初始序列:(5,4,1,6,8,3,2,7)
9.7
若有m个初始归并段,共u个记录 归并趟数=logkm k越大,WPL越少,则读写记录的次数越少。


在内存空间允许的情况下,k越大越好!

9.7
k路平衡归并的关键字比较时间分析:
若在归并中采用简单选择方法,每次在k个记录中选择最 小者,需要关键字比较k-1次。
每 趟 归 并 u 个 记 录 需 要 做 (u-1)*(k-1) 次 比 较 , s= logkm)趟归并总共需要的关键字比较次数为:
某种内排序方法


文件Fin.dat
容量为750个记录

(含4500个记录)
产生6个长度为 750个记录的有序 文件F1~F6。
第一阶段
第二阶段:归并过程

《数据结构》习题汇编09-第九章-排序-试题

《数据结构》习题汇编09-第九章-排序-试题

《数据结构》习题汇编09-第九章-排序-试题数据结构课程(本科)第九章试题一、单项选择题1.若待排序对象序列在排序前已按其排序码递增顺序排列,则采用()方法比较次数最少。

A. 直接插入排序B. 快速排序C. 归并排序D. 直接选择排序2.如果只想得到1024个元素组成的序列中的前5个最小元素,那么用()方法最快。

A. 起泡排序B. 快速排序C. 直接选择排序D. 堆排序3.对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作,直到子序列为空或只剩一个元素为止。

这样的排序方法是()。

A. 直接选择排序B. 直接插入排序C. 快速排序D. 起泡排序4.对5个不同的数据元素进行直接插入排序,最多需要进行()次比较?A. 8B. 10C. 15D. 255.如果输入序列是已经排好顺序的,则下列算法中()算法最快结束?A. 起泡排序B. 直接插入排序C. 直接选择排序D. 快速排序6.如果输入序列是已经排好顺序的,则下列算法中()算法最慢结束?A. 起泡排序B. 直接插入排序C. 直接选择排序D. 快速排序7.下列排序算法中()算法是不稳定的。

A. 起泡排序B. 直接插入排序C. 基数排序D. 快速排序8.假设某文件经过内部排序得到100个初始归并段,那么如果要求利用多路平衡归并在3 趟内完成排序,则应取的归并路数至少是()。

A. 3B. 4C. 5D. 69.采用任何基于排序码比较的算法,对5个互异的整数进行排序,至少需要()次比较。

A. 5B. 6C. 7D. 810.下列算法中()算法不具有这样的特性:对某些输入序列,可能不需要移动数据对象即可完成排序。

A. 起泡排序B. 希尔排序C. 快速排序D. 直接选择排序11.使用递归的归并排序算法时,为了保证排序过程的时间复杂度不超过O(nlog2n),必须做到()。

A. 每次序列的划分应该在线性时间内完成B. 每次归并的两个子序列长度接近C. 每次归并在线性时间内完成D. 以上全是12.在基于排序码比较的排序算法中,()算法的最坏情况下的时间复杂度不高于O(nlog2n)。

第九章排序习题 九

第九章排序习题 九

第九章排序习题九一、填空题1.每次从无序表中取出一个元素,把它插入到有序表中的适当位置,此种排序方法叫做插入排序;每次从无序表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做选择排序。

2每次直接或通过基准元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做交换排序,每次使两个相邻的有序表合并成一个有序表的排序方法叫做二路归并排序。

3在直接选择排序中,记录比较次数的时间复杂度为O(n2),记录移动次数的时间复杂度为O(n) 。

4在堆排序的过程中,对n个记录建立初始堆需要进行[n/2]次筛运算,由初始堆到堆排序结束,需要对树根结点进行n-1次筛运算。

5在堆排序过程中,对任一分支结点进行筛运算的时间复杂度为O(log2n),整个堆排序过程的时间复杂度为O(nlog2n)。

6假定一组的记录的排序码为(46,79,56,38,40,84),则利用堆排序方法建立的初始堆为(84,79,56,38,40,46)。

7快速排序在平均情况下的时间复杂度为O(nlog2n),在最坏情况下的时间复杂度为O(n2)。

8快速排序在平均情况下的空间复杂度为O(log2n),在最坏情况下的空间复杂度为O(n) 。

9在快速排序方法中,进行每次划分时,是从当前待排序空间的两端向中间依次查找出处于逆序的元素并交换之,最后将基准元素交换到一个确定位置,从而以该位置把当前区间划分为前后两个子区间。

10假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序的一次划分的结果为[38 40]46[5679 84]。

11假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序过程中,对应二叉树的深度为4 ,分支点结点数为4 。

12在二路归并排中,对n个记录进行归并的趟数为[log2n] 。

13在归并排序中,进行每趟归并的时间复杂度为O(n),整个排序过程的时间复杂度为O(nlog2n),空间复杂度为O(n) 。

数据结构_第9章_查找2-二叉树和平衡二叉树

数据结构_第9章_查找2-二叉树和平衡二叉树

F
PS
C
PR
CL Q
QL SL S SL
10
3
18
2
6 12
6 删除10
3
18
2
4 12
4
15
15
三、二叉排序树的查找分析
1) 二叉排序树上查找某关键字等于给定值的结点过程,其实 就是走了一条从根到该结点的路径。 比较的关键字次数=此结点的层次数; 最多的比较次数=树的深度(或高度),即 log2 n+1
-0 1 24
0 37
0 37
-0 1
需要RL平衡旋转 (绕C先顺后逆)
24
0
-012
13
3573
0
01
37
90
0 53 0 53
0 90
作业
已知如下所示长度为12的表:
(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)
(1) 试按表中元素的顺序依次插入一棵初始为空的二叉 排序树,画出插入完成之后的二叉排序树,并求其在 等概率的情况下查找成功的平均查找长度。
2) 一棵二叉排序树的平均查找长度为:
n i1
ASL 1
ni Ci
m
其中:
ni 是每层结点个数; Ci 是结点所在层次数; m 为树深。
最坏情况:即插入的n个元素从一开始就有序, ——变成单支树的形态!
此时树的深度为n ; ASL= (n+1)/2 此时查找效率与顺序查找情况相同。
最好情况:即:与折半查找中的判ห้องสมุดไป่ตู้树相同(形态比较均衡) 树的深度为:log 2n +1 ; ASL=log 2(n+1) –1 ;与折半查找相同。

第9章排序(上)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社

第9章排序(上)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社
9.1 排序的基本概念 9.2 插 入 排 序 9.3 交 换 排 序 9.4 选 择 排 序 9.5 归并排序 9.6 基数排序 9.7 外排序
9.1
1. 什么是排序
所谓排序,是要整理表中的记录,使之按关键字递增(递减)
排 有序排列。其确切定义如下:
序 的 基
输 入 : n 个 记 录 , R0,R1,…,Rn-1, 其 相 应 的 关 键 字 分 别 为 k0,k1,…,kn-1。

} while (j>=0 && R[j].key>tmp.key);
R[j+1]=tmp;
//在j+1处插入R[i]
} } }
直接插入排序算法分析:
9.2
最好的情况(关键字在记录序列中顺序有序):
“比较”的次数:
n1
1 n 1
i 1
“移动”的次数: 0
插 最坏的情况(关键字在记录序列中逆序有序):
……
R[n-1]


一趟排序

R[0] ……
R[i-1] R[i] R[i+1] …… R[n-1]
有序区
无序区
初始时,有序区只有一个元素R[0] i=1~n-1,共经过n-1趟排序
【例9.1】 已知有10个待排序的记录,它们的关键字序列为
(75,87,68,92,88,61,77,96, 80,72),给出用直接插入排序法进 行排序的过程。
最终结果 61 68 72 75 77 80 87 88 92 96
i=1的行表示i=1这一趟的排序结果
以i=6即插入77为例说明一趟的过程:
i=5的排序结果:
有序区
0

数据结构-C语言描述(第二版)(耿国华)章 (9)

数据结构-C语言描述(第二版)(耿国华)章 (9)

第9章 内部排序
我们知道, 在进行直接插入排序时, 若待排序记录序 列已经有序时, 直接插入排序的时间复杂度可以提高到 O(n)。 可以设想, 若待排序记录序列基本有序时, 即序 列中具有特性 r[i].key<Max{ r[j].key},(1≤j<i) 的记录较少时, 直接插入排序的效率会大大提高。 希尔排 序正是从这一点出r[0];
/*将待插入记录插入到已排序的序列
}
第9章 内部排序
【算法9.1 直接插入排序】 该算法的要点是:① 使用监视哨r[0]临时保存待插入 的记录; ② 从后往前查找应插入的位置;③ 查找与移动在同一 循环中完成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。从时间 耗费角度来看, 主要时间耗费在关键字比较和移动元素上。 对于一趟插入排序,算法中的while循环的次数主要取决 于待插记录与前i-1个记录的关键字的关系上。
· 向量结构:将待排序的记录存放在一组地址连续的存 储单元中。 由于在这种存储方式中,记录之间的次序关系由其存 储位置来决定,所以排序过程中一定要移动记录才行。
第9章 内部排序
· 链表结构:采用链表结构时,记录之间逻辑上的相 邻性是靠指针来维持的,这样在排序时,就不用移动记录元素, 而只需要修改指针。 这种排序方式被称为链表排序。
第9章 内部排序 第9章 内部排序
9.1 9.2 插入类排序 9.3 交换类排序法 9.4 选择类排序法 9.5 9.6 分配类排序 9.7 各种排序方法的综合比较
第9章 内部排序 9.1 排序的基本概念
1. 排序
有n个记录的序列{R1,R2,…,Rn},其相应关键字的序列 是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序, 要求找出当前下标序列1,2,…, n的一种排列p1,p2, …,pn, 使得相应关键字满足如下的非递减(或非递增)关系,即: Kp1≤Kp2≤…≤Kpn , 这 样 就 得 到 一 个 按 关 键 字 有 序 的 记 录 序 列 {Rp1,Rp2,…,Rpn}。

[课件]数据结构 第九章 查找

[课件]数据结构 第九章 查找

例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 一趟分组: 38 65 97 76 13 27 48 55 4
一趟排序: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 三趟分组: 4 48 55 27 49 38 65 97 76
第十章 排序
排序定义——将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫~ 排序分类
按待排序记录所在位置
内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序
按排序依据原则
插入排序:直接插入排序,折半插入排序,希尔排序 交换排序:冒泡排序,快速排序 选择排序:简单选择排序,堆排序 归并排序:2-路归并排序 基数排序

4 一趟排序:13 27 48 38 27 49 55 65 97 76 55 4 38 j j j ji ij ij ij i i i
二趟排序: 13 4 48 38 27 49 55 65 97 76 Ch8_3.c
希尔排序特点
子序列的构成不是简单的"逐段分割",而是将相隔某个增 量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体 上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1
2 ( n + 4 )( n 1 ) ( i + 1) = 2

数据结构第九章 排序题库(40道)

数据结构第九章 排序题库(40道)

数据结构第九章排序1、内排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为( )。

——[单选题]A 希尔排序B 冒泡排序C 直接插入排序D 简单选择排序正确答案:C2、对有n个记录的表进行直接插入排序,在最坏情况下需进行( )次关键字比较。

——[单选题]A n-1B n+1C n/2D n(n-1)/2正确答案:D3、在下列算法中,( )算法可能出现下列情况:在最后一趟开始之前,所有的元素都不在其最终的位置上。

——[单选题]A 堆排序B 冒泡排序C 直接插入排序D 快速排序正确答案:C4、对数据序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排序变为{9,15,7,8,20,-1,4},则采用的是( )算法。

——[单选题]A 简单选择排序B 冒泡排序C 直接插入排序D 堆排序正确答案:C5、数据序列{5,4,15,10,3,1,9,6,2}是某排序方法第一趟后的结果,该排序算法可能是( )。

——[单选题]A 冒泡排序B 二路归并排序C 堆排序D 简单选择排序正确答案:B6、从未排序序列中挑选元素,并将其依次插入已排序序列的一端的方法,称为( )。

——[单选题]A 希尔排序B 归并排序C 直接插入排序D 简单选择排序正确答案:D7、在以下排序方法中,关键字比较的次数与元素的初始排列次序无关的是( )。

——[单选题]A 希尔排序B 冒泡排序C 插入排序D 简单选择排序正确答案:D8、对n个不同的关键字进行递增冒泡排序,在下列哪种情况下比较的次数最多( )。

——[单选题]A 元素无序B 元素递增有序C 元素递减有序D 都一样正确答案:C9、对数据序列(8,9,10,4,5,6,20,1,2)进行递增排序,采用每趟冒出一个最小元素的冒泡排序算法,需要进行的趟数至少是( )。

——[单选题]A 3B 4C 5D 8正确答案:C10、为实现快速排序法,待排序序列最好采用的存储方式是( )。

数据结构习题汇编09 第九章 排序 试题

数据结构习题汇编09 第九章 排序 试题

数据结构课程(本科)第九章试题一、单项选择题1.若待排序对象序列在排序前已按其排序码递增顺序排列,则采用()方法比较次数最少。

A. 直接插入排序B. 快速排序C. 归并排序D. 直接选择排序2.如果只想得到1024个元素组成的序列中的前5个最小元素,那么用()方法最快。

A. 起泡排序B. 快速排序C. 直接选择排序D. 堆排序3.对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作,直到子序列为空或只剩一个元素为止。

这样的排序方法是()。

A. 直接选择排序B. 直接插入排序C. 快速排序D. 起泡排序4.对5个不同的数据元素进行直接插入排序,最多需要进行()次比较?A. 8B. 10C. 15D. 255.如果输入序列是已经排好顺序的,则下列算法中()算法最快结束?A. 起泡排序B. 直接插入排序C. 直接选择排序D. 快速排序6.如果输入序列是已经排好顺序的,则下列算法中()算法最慢结束?A. 起泡排序B. 直接插入排序C. 直接选择排序D. 快速排序7.下列排序算法中()算法是不稳定的。

A. 起泡排序B. 直接插入排序C. 基数排序D. 快速排序8.假设某文件经过内部排序得到100个初始归并段,那么如果要求利用多路平衡归并在3 趟内完成排序,则应取的归并路数至少是()。

A. 3B. 4C. 5D. 69.采用任何基于排序码比较的算法,对5个互异的整数进行排序,至少需要()次比较。

A. 5B. 6C. 7D. 810.下列算法中()算法不具有这样的特性:对某些输入序列,可能不需要移动数据对象即可完成排序。

A. 起泡排序B. 希尔排序C. 快速排序D. 直接选择排序11.使用递归的归并排序算法时,为了保证排序过程的时间复杂度不超过O(nlog2n),必须做到()。

A. 每次序列的划分应该在线性时间内完成B. 每次归并的两个子序列长度接近C. 每次归并在线性时间内完成D. 以上全是12.在基于排序码比较的排序算法中,()算法的最坏情况下的时间复杂度不高于O(nlog2n)。

第九章——5直接选择排序

第九章——5直接选择排序

13
27
38
49
49*
97
65
76
13
27
38
49
49*
65
97
76
第七趟排序后:
13
27
38
49
49*
65
76
97
2 直接选择排序算法
ห้องสมุดไป่ตู้
算法9-8
void SelectSort(int a[],int n ) { /*直接选择排序算法*/
int i,j,temp,min;
/*min用于存放最小记录的下标*/
• 直接选择排序是不稳定的排序方法
谢谢学习
主讲教师:赵宁
}
}
}
3 直接选择排序算法的性能分析
时间性能 • “移动”的次数 时间性能
待排序记录为正序:0 待排序记录为逆序:3(n-1) • “比较”的次数:与记录的初始排列无关
(n-1)+(n-2)+…+2+1=n(n-1)/2 • 时间复杂度都为O(n2)
3 直接选择排序算法的性能分析
其他性能
• 直接选择排序在排序过程中只用了一个辅助单元用于记录 的交换,因此其空间复杂度是O(1),为就地排序。
1 直接选择排序基本思想——排序示例
1
2
3
4
5
6
7
8
初始关键字序列:
49
38
65
97
76
13
27
49*
第一趟排序后:
13
38
65
97
76
49
27
49*
第二趟排序后:
13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第2趟 (dk=3)
13 2074 49* 5358 0247 49 3585 65 97 76
第3趟 (dk=1)
1034 0143 4297* 38 4297* 49 55 65 9776 7967
算法分析:开始时dk 的值较大,子序列中的对象较少,排序速度 较快;随着排序进展,dk 值逐渐变小,子序列中对象个数 逐渐变多,由于前面工作的基础,大多数对象已基本有序, 所以排序速度仍然很快。
优点:比较的次数大大减少,全部元素比较次数仅为O(nlog2n)。 时间效率:虽然比较次数大大减少,可惜移动次数并未减少,
所以排序效率仍为O(n2) 。 空间效率: O(1) 稳定性:稳定
对应程序见教材P267(仅用于顺序表)
讨论:若记录是链表结构,用直接插入排序行否?折半插入 排序呢?
答:直接插入不仅可行,而且还无需移动元素,时间效率更 高!自测卷上有对应的程序设计题。但链表无法“折半”!
0
MaxNum
561
1
21
02
2
25
043
3
49
0
4
25*
3
5
16
1
6
08
5
指向第1个元素 指向头结点
16
表插入排序的算法
int LinkInsertSort ( staticlinklis<Type> & list ) {
list.v[0].Key = MaxNum;
list.v[0]. Link = 1;
d=关键字的位数(长度)
6
9.2 插入排序
插入排序的基本思想是:每步将一个待排序的对象, 按其关键码大小,插入到前面已经排好序的一组对 象的适当位置上,直到对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的。
插入排序有多种具体实现算法:
1) 直接插入排序
2) 折半插入排序
3) 2-路插入排序
Knuth利用大量的实验统计资料得出,当n很大 时,关键码平均比较次数和对象平均移动次数 大约在 n1.25 到 1.6n1.25 的范围内。这是在利用 直接插入排序作为子序列排序方法的情况下得 到的。
22
希尔排序算法(其中某一趟的排序操作)
void ShellInsert(SqList &L,int dk) {
8
例2:关键字序列T= (21,25,49,25*,16,08),
请写出直接插入排序的具体实现过程。 *表示后一个25
解:假设该序列已存入一维数组V[7]中,将V[0]作为缓冲或 暂存单元(Temp)。则程序执行过程为:
初态:
22410暂存55968*
021816
21516
2425951* 2459*
对应程序参见教材P265。
9
直接插入排序的算法分析 若设待排序的对象个数为n,则算法需要进行
n-1次插入。 最好情况下,排序前对象已经按关键码大小从
小到大有序,每趟只需与前面的有序对象序列 的最后一个对象的关键码比较 1 次,移动 2 次对象。因此,总的关键码比较次数为n-1, 对象移动次数为 2(n-1)。
15
例:关键字序列 T=(21,25,49,25*,16,08),
请写出表插入排序的具体实现过程。
*表示后一个25
解:假设该序列(结构类型)已存入一维数组V[7]中,将V[0] 作为表头结点。则算法执行过程为:
初态 i=1
i=2 i=3 i=4 i=5 i=6
i 关键字 V[i].key 指针 V[i].link
数据结构课程的内容
1
第9章 内部排序
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
2
9.1 概述
1. 什么是排序? 将一组杂乱无章的数据按一定的规律顺次排列起来。
存放在数据表中
按关键字排序
2. 排序的目的是什么? ——便于查找!
3.排序算法的好坏如何衡量?
4
6. 顺序存储(顺序表)的抽象数据类型如何表示?
注:大多数排序算法都是针对顺序表结构的(便于直接移动元素)
# define MAXSIZE 20 //设记录不超过20个 typedef int KeyType ; //设关键字为整型量(int型)
Typedef struct {
//定义每个记录(数据元素)的结构
214569*
49 08
0 123456
完成!
i=1 i=2 i=3 i=4 i=5 i=6
时间效率: O(n2)——因为在最坏情况下,所有元素的比较
次数总和为(0+1+…+n-1)→O(n2)。其他情况
下还要加上移动元素的次数。
空间效率:O(1)——因为仅占用1个缓冲单元
算法的稳定性:稳定——因为25*排序后仍然在25的后面。
折半插入排序的改进——2-路插入排序见教材P267。
13
折半插入排序的算法分析 • 折半查找比顺序查找快,所以折半插入排序
就平均性能来说比直接插入排序要快。 • 在插入第 i 个对象时,需要经过 log2i +1
次关键码比较,才能确定它应插入的位置。 因此,将 n 个对象用折半插入排序所进行 的关键码比较次数为:n*log2n • 折半插入排序是一个稳定的排序方法。
//按增量序列dlta[0…t-1]对顺序表L作Shell排序
for(k=0;k<t;++k)
dk值依次装在dlta[t]中
ShellSort(L,dlta[k]); //增量为dlta[k]的一趟插入排序
} // ShellSort
21
附:希尔排序算法分析
对特定的待排序对象序列,可以准确地估算关 键码的比较次数和对象移动次数。但想要弄清 关键码比较次数和对象移动次数与增量选择之 间的依赖关系,并给出完整的数学分析,还没 有人能够做到。
20
时间效率: O(n1.25)~O(1.6n1.25)——经验公式 空间效率:O(1)——因为仅占用1个缓冲单元 算法的稳定性:不稳定——因为49*排序后却到了49的前面
希尔排序算法(主程序)
参见教材P272
void ShellSort(SqList &L,int dlta[ ],int t){
参见教材P272
//对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子 for(i=dk+1;i<=L.length; ++ i) //开始将r[i] 插入有序增量子表
}SqList ;
5
7. 内部排序的算法有哪些?
——按排序的规则不同,可分为5类: • 插入排序 • 交换排序(重点是快速排序) • 选择排序 • 归并排序 • 基数排序
——按排序算法的时间复杂度不同,可分为3类: •简单的排序算法:时间效率低,O(n2) •先进的排序算法: 时间效率高,O( nlog2n ) •基数排序算算法:时间效率高,O( d×n)
称为外部排序。
注:外部排序时,要将数据分批调入内存来排序,中间 结果还要及时放入外存,显然外部排序要复杂得多。
5.待排序记录在内存中怎样存储和处理? ① 顺序排序——排序时直接移动记录; ② 链表排序——排序时只移动指针; ③ 地址排序——排序时先移动地址,最后再移动记录。
注:地址排序中可以增设一维数组来专门存放记录的地址。
14
4)表插入排序
基本思想:在顺序存储结构中,给每个记录增开一个指针分 量,在排序过程中将指针内容逐个修改为已经整理(排序) 过的后继记录地址。 优点:在排序过程中不移动元素,只修改指针。
此方法具有链表排序和地址排序的特点。 回忆: ② 链表排序——排序时只移动指针; ③ 地址排序——排序时先移动地址,最后再移动记录。
KeyType key ;
//关键字
InfoType otherinfo; //其它数据项
}RecordType ;
Typedef struct {
//定义顺序表的结构
RecordType r [ MAXSIZE +1 ]; //存储顺序表的向量
//r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
11
•若待排序对象序列中出现各种可能排列的概率相同, 则可取上述最好情况和最坏情况的平均情况。在平 均情况下的关键码比较次数和对象移动次数约为 n2/4。因此,直接插入排序的时间复杂度为 o(n2)。
•直接插入排序是一种稳定的排序方法。
12
2) 折半插入排序
新元素插入到哪里?在已形成的有序表中折半查找,并在适 当位置插入,把原来位置上的元素向后顺移。
• 时间效率——排序速度(即排序所花费的全部比较次数) • 空间效率——占内存辅助空间的大小 • 稳定性——若两个记录A和B的关键字值相等,但排序后A、
B的先后次序保持不变,则称这种排序算法是稳定的。
3
4. 什么叫内部排序?什么叫外部排序? ——若待排序记录都在内存中,称为内部排序; ——若待排序记录一部分在内存,一部分在外存,则
讨论:此算法得到的只是一个有序链表,查找记录时只 能满足顺序查找方式。
改进:可以根据表中指针线索,很快对所有记录重排, 形成真正的有序表(顺序存储方式),从而能满足 折半查找方式。具体实现见教材P269。
18
5)希尔(shell)排序(又称缩小增量排序)
基本思想:先将整个待排记录序列分割成若干子序列,分 别进行直接插入排序,待整个序列中的记录“基本有序” 时,再对全体记录进行一次直接插入排序。 技巧:子序列的构成不是简单地“逐段分割”,而是将 相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩 短(例如依次取5,3,1),直到dk=1为止。 优点:让关键字值小的元素能很快前移,且序列若基本 有序时,再用直接插入排序处理,时间效率会高很多。
相关文档
最新文档