(完整word版)数据结构第八章排序
(完整word版)数据结构 第八章排序
第八章排序:习题习题一、选择题1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序2.设有1000个无序的记录,希望用最快的速度挑选出其中前10个最大的记录,最好选用( )排序法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.在待排序的记录序列基本有序的前提下,效率最高的排序方法是( )。
A.插入排序B.选择排序C.快速排序D.归并排序’4.不稳定的排序方法是指在排序中,关键字值相等的不同记录的前后相对位置( )。
A.保持不变B.保持相反C.不定D.无关5.内部排序是指在排序的整个过程中,全部数据都在计算机的( )中完成的排序。
A. 内存储器B.外存储器C.内存储器和外存储器D.寄存器6.用冒泡排序的方法对n个数据进行排序,第一趟共比较( )对记录。
A.1B.2C.n-lD.n7.直接插入排序的方法是从第( )个记录开始,插入前边适当位置的排序方法。
A.1B.2C.3D.n8.用堆排序的方法对n个数据进行排序,首先将n个记录分成( )组。
A.1B.2C.n-lD.n9.归并排序的方法对n个数据进行排序,首先将n个记录分成( )组,两两归并。
A.1B.2C.n-lD.n10.直接插入排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树11.冒泡排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树12.快速排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树13.排序方法中,从未排序序列中依次取出记录与已排序序列(初始时为空)中的记录进行比较,将其放入已排序序列的正确位置上的方法,称为( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序14.每次把待排序的记录划分为左、右两个子序列,其中左序列中记录的关键字均小于等于基准记录的关键字,右序列中记录的关键字均大于基准记录的关键字,则此排序方法叫做( )。
(19)第八章 排序
21 21
i=2
0 25
1 21 21
2 25 25 25 25 25
3 49 49 49 49 49
4 5 25* 16 25* 16 25* 16 25* 16 25* 16
6 08 08 08 08 08
i=3
49
21 21
i=4
25*
21
21
25
25*
49
16
08
9
i=3
49
21 21
25 25 25 25 25
排序的时间开销: 排序的时间开销是衡量算法好 坏的最重要的标志。排序的时间开 销主要取决于算法执行中的数据比 较次数与数据移动次数。
4
内部排序分类
依排序的实现方法进行分类 插入排序、交换排序、选择排序、 归并排序、和基数排序等。 依算法的执行效率进行分类 简单排序---时间复杂度O(n2) 先进排序方法---时间复杂度O(n log2n)
25* 16 49 16
08
08 08
7
i=4
25*
21 21
i=2
0 25
1 21
21
2 25
25 25
3 49
49 49
4 5 25* 16
25* 16 25* 16
6 08
08 08
i=3
49
21
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
08
08 08
8
i=4
25*
15
折半插入排序的算法 注意,最后折半结束
后有: higt+1=low void BinInsSort ( SqList &L ) { int low, high; for ( int i = 2; i < =L.length; i++) { //L.r[0]空闲无用 low = 1; high = i-1; L.r[0].key = L.r[i].key; while ( low <= high ) { //折半查找插入位置 int mid = ( low + high )/2; if ( L.r[0].key < L.r[mid].key ) high = mid - 1; else low = mid + 1; } for ( int j = i-1; j >= high+1; j-- ) L.r[j+1]= L.r[j]; //记录后移 L.r[high+1] = L.r[0]; //插入
数据结构——排序
数据结构——排序在计算机科学中,数据结构是组织和存储数据的方式,而排序则是对数据进行有序排列的操作。
排序在很多应用中都起着至关重要的作用,比如从大量数据中快速查找特定元素、生成有序的报告或者优化算法的性能等。
想象一下,你有一堆杂乱无章的数字,就像一堆随意摆放的玩具。
现在你需要把它们按照从小到大或者从大到小的顺序排列好,这就是排序要做的事情。
常见的排序算法有很多,比如冒泡排序、插入排序、选择排序、快速排序、归并排序等等。
接下来,咱们一个一个来看看。
先说说冒泡排序。
它就像是水里的泡泡,轻的往上跑,重的往下沉。
每次比较相邻的两个元素,如果顺序不对就交换它们。
这样一轮一轮地比较和交换,直到整个序列都有序。
比如说,有一组数字 5,3,8,2,1 。
第一轮比较,先比较 5 和 3 ,因为 5 大于 3 ,所以交换位置,变成 3,5,8,2,1 。
接着比较 5 和8 ,顺序对的,不交换。
再比较 8 和 2 ,交换,变成 3,5,2,8,1 。
然后比较 8 和 1 ,交换,变成 3,5,2,1,8 。
这一轮结束,最大的 8 就“浮”到了最后。
然后再从头开始第二轮比较,直到所有数字都排好序。
插入排序呢,就像是打牌时整理手牌。
每次从待排序的元素中取出一个,插入到已排序的部分中的合适位置。
还是用上面的例子 5,3,8,2,1 。
一开始,5 是已排序部分,然后 3 要插入,因为 3 小于 5 ,所以把 5 往后移一位,把 3 放在 5 前面,已排序部分就变成 3,5 。
接着 8 插入,因为 8 大于 5 ,直接放在后面,已排序部分变成 3,5,8 。
2 插入,依次和 8,5,3 比较,最后放在 3 前面,已排序部分变成 2,3,5,8 。
最后 1 插入,经过比较移动,最终排序为 1,2,3,5,8 。
选择排序则是每次从待排序的元素中选择最小(或最大)的元素,放到已排序序列的末尾。
对于 5,3,8,2,1 这组数字。
第一轮,从 5,3,8,2,1 中选择最小的 1 ,与第一个 5 交换位置,变成 1,3,8,2,5 。
数据结构第八章排序
例 i=1
(30) 13 70 85 39 42 6 20
i=2 13 (13 30) 70 85 39 42 6 20
…...
i=7 6 (6 i=8 20 (6
s i=8 20 (6
s i=8 20 (6
i=8 20 (6
i=8 20 (6
13 30 39 42 70 85 ) 20
13 30 39 m
❖算法描述
#define T 3 int d[]={5,3,1};
例
1439 2378 6458 9575 746 1439 2378 6458 9575 746
j j j j ji i i i i
一趟排序:13 247 48 3585 247 49 5358 65 97 76 jj j j ji ij ij ij i i i
13 输出:13
27
38
49
50 76 65 97
13 输出:13
97
38
49
50 76 65 27
13 输出:13 27
38
50
49
97 76 65 27
13 输出:13 27
65
50
49
97 76 38 27
13 输出:13 27 38
49
50
65
97 76 38 27
13 输出:13 27 38
k
k
i=2 一趟: 13 [3287 65 97 76 49 3287 ]
jjjjj 二趟: 13 27 [65 97 76 49 38 ]
三趟: 13 27 38 [97 76 49 65 ]
四趟: 13 27 38 49 [76 97 65 ]
数据结构第八章_排序
49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 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 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价
例
38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)
(完整word版)大学数据结构期末知识点重点总结(考试专用)
第一章概论1。
数据结构描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构、存储结构和运算2。
数据的逻辑结构是从具体问题抽象出来的数学模型,反映了事物的组成结构及事物之间的逻辑关系可以用一组数据(结点集合K)以及这些数据之间的一组二元关系(关系集合R)来表示:(K, R)结点集K是由有限个结点组成的集合,每一个结点代表一个数据或一组有明确结构的数据关系集R是定义在集合K上的一组关系,其中每个关系r(r∈R)都是K×K上的二元关系3.数据类型a。
基本数据类型整数类型(integer)、实数类型(real)、布尔类型(boolean)、字符类型(char)、指针类型(pointer)b。
复合数据类型复合类型是由基本数据类型组合而成的数据类型;复合数据类型本身,又可参与定义结构更为复杂的结点类型4.数据结构的分类:线性结构(一对一)、树型结构(一对多)、图结构(多对多)5。
四种基本存储映射方法:顺序、链接、索引、散列6。
算法的特性:通用性、有效性、确定性、有穷性7.算法分析:目的是从解决同一个问题的不同算法中选择比较适合的一种,或者对原始算法进行改造、加工、使其优化8.渐进算法分析a.大Ο分析法:上限,表明最坏情况b.Ω分析法:下限,表明最好情况c.Θ分析法:当上限和下限相同时,表明平均情况第二章线性表1.线性结构的基本特征a.集合中必存在唯一的一个“第一元素”b。
集合中必存在唯一的一个“最后元素"c.除最后元素之外,均有唯一的后继d。
除第一元素之外,均有唯一的前驱2.线性结构的基本特点:均匀性、有序性3。
顺序表a.主要特性:元素的类型相同;元素顺序地存储在连续存储空间中,每一个元素唯一的索引值;使用常数作为向量长度b。
线性表中任意元素的存储位置:Loc(ki)= Loc(k0)+ i * L(设每个元素需占用L个存储单元)c. 线性表的优缺点:优点:逻辑结构与存储结构一致;属于随机存取方式,即查找每个元素所花时间基本一样缺点:空间难以扩充d.检索:ASL=【Ο(1)】e。
《数据结构》八大排序算法必读!
引言概述:数据结构是计算机科学中的重要基础知识,而排序算法则是数据结构中最基本也是最常用的算法之一。
本文将介绍数据结构中的八大排序算法,包括插入排序、选择排序、冒泡排序、快速排序、归并排序、堆排序、计数排序和桶排序。
通过深入理解这些排序算法的原理和特点,能够为我们在实际编程中选择合适的排序算法提供指导。
正文内容:一、插入排序1.直接插入排序:将待排序的元素逐个插入已排好序的序列中。
2.希尔排序:将待排序的元素按照一定间隔分组,然后在每个分组内进行插入排序操作。
二、选择排序1.简单选择排序:每次从待排序序列中选择最小的元素放到已排序序列的末尾。
2.堆排序:构建一个大顶堆,每次取堆顶元素并调整堆的结构。
三、冒泡排序1.冒泡排序:通过相邻元素的比较和交换,将最大的元素逐渐冒泡到待排序序列的末尾。
四、快速排序1.快速排序:选择一个基准元素,将序列分为两部分,小于基准元素的放在左边,大于基准元素的放在右边,然后递归地对左右子序列进行排序。
五、归并排序1.归并排序:将序列分成两部分分别进行排序,然后将两个有序的子序列合并成一个有序序列。
六、堆排序1.堆排序:通过构建一个最大堆或最小堆,将最大或最小元素依次取出并调整堆的结构,从而得到有序序列。
七、计数排序1.计数排序:统计待排序序列中各元素出现的次数,然后按照元素的大小顺序从小到大依次输出。
八、桶排序1.桶排序:将待排序的元素分到不同的桶中,每个桶中的元素可以使用其他排序算法进行排序,然后将桶中的元素按顺序依次输出。
总结:数据结构中的八大排序算法各有特点和适用场景。
插入排序适用于小规模的数据排序,选择排序适用于大规模且基本有序的数据排序,冒泡排序适用于简单排序,快速排序适用于大规模数据排序,归并排序适用于链表和外排序,堆排序适用于需要稳定排序的场景,计数排序适用于数据范围较小的场景,桶排序适用于浮点数排序。
通过熟练掌握这些排序算法的原理和实现方式,可以在实际编程中根据需求选择合适的排序算法,提升程序的效率和性能。
数据结构第八章排序-修改精品文档69页
排序的分类
数据表的存储方式
*顺序存储方式通过移动记录的相对存储位置实
77 22 88
11 22 30 44 77 88
排序的基本概念 插入排序 交换排序 选择排序 归并排序 基数排序 各种方法的比较
1
§8.1 排序的概念
什么是排序(Sorting)?
简单地说,排序就是将一组杂乱无章 的数据按一定的规律排列起来(递增 或递减)。
排序是计算机中经常遇到的操作。
排序的概念
数据表(Data List) 待排序的记录的有限集合。 关键字(Key) 作为排序依据的各记录中的属性域。 排序(Sorting)使一组任意排列的数据表变成一组
按关键字线性有序(递增或递减)的数据表。
排序前:数据表: { R1 ,R2 , R3 ,……, Rn }
关键字序列: { k1 , k2 , k3 ,……, kn }
排序后:数据表: { R’1 ,R’2 , R’3 ,……, R’n }
关键字序列: { k’1 , k’2 , k’3 ,……, k’n }
*链式存储方式通过各结点修改指针实现排序
排序前 h 排序后 h
30 11 30 11
44 77
22
44
77 22
5
排序算法分析
排序的时间效率: 通常用算法执行中的数据比较次数
与数据移动次数来衡量。
排序的空间效率:在算法执行时所需的附加存储空间多
少来衡量。
为简单起见,数据的存储结构采用顺序方式存储, 同时假定关键字是整数。记录存储数据类型如下:
数据结构第八章
第八章排序8.1 基本概念排序在数据处理中经常遇到,也是一种重要的运算。
排序的方法很多,主要原则是时间复杂度和空间复杂度最低。
关键字:对象是由记录组成的文件,而记录是由若干个数据项(域)组成,其中有一项或多项可用来标识一个记录称关键字。
排序:整理文件记录,使它们按关键字递增或递减的次序排列。
R1,R2,……,Rn==>Ri1,Ri2,……,Rin内部排序:整个文件都在内存中处理,不涉及内外存交换,称为内部排序。
外部排序:排序过程中涉及到内外存交换,不能一次完成,称为外部排序。
排序分类:插入排序、交换排序、选择排序、归并排序、分配排序等等。
稳定性:在排序过程中,关键字相同的记录相对位置不发生改变叫稳定的排序方法,否则称为不稳定的排序方法。
存储结构:1.数组2.链表3.索引表假设:我们所处理的对象是R[n]。
定义:typedef struct{ int key;datatype other;}rectype;rectype R[n];8.2 插入排序1.直接插入排序基本思想:R[1],R[2],……,R[i],……,R[n]假设排序过程中的某一时刻,R被划分成两个子区,R[1]……R[i-1]已经有序,R[i]……R[n]为无序区。
那么用R[i]和前面的R[1]……R[i-1]进行比较,将R[i]插入到适当的位置。
初始令i=1,从R[2]开始直至R[n]。
在插入过程中有序区的记录将后移。
例图:算法:void INSERTSORT(rectype R[]){ int i,j;for(i=2;i<n;i++){R[0]=R[i];j=i-1;while(R[0].key<R[j].key)R[j+1]=R[j--];R[j+1]=R[0];}}监视哨:哨兵R[0]1)保存了R[i],还可做中间变量。
2)保证循环结束(最后比较R[0].key<R[0].key?)。
算法分析:1)正序(最好):Cmin=n-1次,无需后移记录Mmin=2(n-1)次移动2)反序(最坏):Cmax=∑i=(n+2)(n-1)/2=O(n2) (i=2…n)Mmax=∑(i-1+2)=(n-1)(n+4)/2=O(n2) (i=2…n)3)直接插入排序方法是稳定的排序方法。
(完整word版)数据结构(c语言版)课后习题答案完整版资料
第1章绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。
(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n—1+n—2+……+1= n(n—1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){if(L—〉next==NULL) return NULL;pmax=L-〉next;//假定第一个结点中数据具有最大值p=L-〉next—>next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax—>data) pmax=p;p=p->next;}return pmax-〉data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间.void inverse(LinkList &L) {// 逆置带头结点的单链表Lp=L-〉next;L->next=NULL;while (p){q=p—>next;// q指向*p的后继p->next=L—>next;L—>next=p; // *p插入在头结点之后p = q;}}(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
数据结构课后习题答案第八章
第八章排序(参考答案)本章所用数据结构#define N 待排序记录的个数typedef struct{ int key;ElemType other;}rectype;rectype r[n+1]; // r为结构体数组8.2稳定排序有:直接插入排序、起泡排序、归并排序、基数排序不稳定排序有:希尔排序、直接选择排序、堆排序希尔排序例:49,38,49,90,70,25直接选择排序例:2,2,1堆排序例:1,2,28.3void StlinkedInsertSort(s , n);// 对静态链表s[1..n]进行表插入排序,并调整结果,使表物理上排序{ #define MAXINT 机器最大整数typedef struct{ int key;int next;}rec;rec s[n+1]; // s为结构体数组s[0].key=maxint; s[1].next=0; //头结点和第一个记录组成循环链表i=2; //从第2个元素开始,依次插入有序链表中while (i<=n){q=0; p=s[0].next; // p指向当前最小元素,q是p的前驱while (p!=0 && s[p].key<s[i].key) // 查找插入位置{ q=p; p=s[p].next; }s[i].next=p; s[q].next=i; // 将第个元素链入i++;} // while(i<=n) 静态链表的插入// 以下是重排静态链表,使之物理有序i=1; p=s[0].next;while (i<=n){WHILE (p<i) p=s[p].next;q=s[p].next;if (i!=p){ s[i] s[p]; s[i].next=p;p=q;i++;}}}//算法结束8.4void TwoWayBubbleSort( rectype r[n+1]; int n)// 对r[1..n]进行双向冒泡排序。
数据结构 ch8 排序技术
(2)如何查找待插入记录的插入位置?
计算机软件技术基础
江苏科技大学 计算机科学与工程学院 黄树成
8.2 插入排序
直接插入排序过程示例
r 0
1 21
2 25 25 25 22
3 22 22 22 25
4 10 10 10 10 25 25 21
5 25* 25* 25* 25*
6 18 18 18 18
请同学们写出这个改进的直接插入排序算法,并分析 时间性能。
计算机软件技术基础
江苏科技大学 计算机科学与工程学院 黄树成
8.2 插入排序
希尔排序
改进的着眼点: (1)若待排序记录按关键码基本有序时,直接插入 排序的效率可以大大提高; (2)由于直接插入排序算法简单,则在待排序记录 数量n较小时效率也很高。
计算机软件技术基础
江苏科技大学 计算机科学与工程学院 黄树成
8.1 概 述
排序算法的存储结构
从操作角度看,排序是线性结构的一种操作,待排序 记录可以用顺序存储结构或链接存储结构存储。 假定1:采用顺序存储结构,关键码为整型,且记录 只有关键码一个数据项。 int r[n+1]; //待排序记录存储在r[1]~r[n],r[0]留做他用 假定2:将待排序的记录序列排序为升序序列。
计算机软件技术基础
江苏科技大学 计算机科学与工程学院 黄树成
8.2 插入排序
希尔排序
基本思想:将整个待排序记录分割成若干个子序列, 在子序列内分别进行直接插入排序,待整个序列中的 记录基本有序时,对全体记录进行直接插入排序。 需解决的关键问题?
(1)应如何分割待排序记录,才能保证整个序列逐步 向基本有序发展? (2)子序列内如何进行直接插入排序?
(完整word版)数据结构 第八章排序
第八章排序:习题习题一、选择题1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序2.设有1000个无序的记录,希望用最快的速度挑选出其中前10个最大的记录,最好选用( )排序法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.在待排序的记录序列基本有序的前提下,效率最高的排序方法是( )。
A.插入排序B.选择排序C.快速排序D.归并排序’4.不稳定的排序方法是指在排序中,关键字值相等的不同记录的前后相对位置( )。
A.保持不变B.保持相反C.不定D.无关5.内部排序是指在排序的整个过程中,全部数据都在计算机的( )中完成的排序。
A. 内存储器B.外存储器C.内存储器和外存储器D.寄存器6.用冒泡排序的方法对n个数据进行排序,第一趟共比较( )对记录。
A.1B.2C.n-lD.n7.直接插入排序的方法是从第( )个记录开始,插入前边适当位置的排序方法。
A.1B.2C.3D.n8.用堆排序的方法对n个数据进行排序,首先将n个记录分成( )组。
A.1B.2C.n-lD.n9.归并排序的方法对n个数据进行排序,首先将n个记录分成( )组,两两归并。
A.1B.2C.n-lD.n10.直接插入排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树11.冒泡排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树12.快速排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树13.排序方法中,从未排序序列中依次取出记录与已排序序列(初始时为空)中的记录进行比较,将其放入已排序序列的正确位置上的方法,称为( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序14.每次把待排序的记录划分为左、右两个子序列,其中左序列中记录的关键字均小于等于基准记录的关键字,右序列中记录的关键字均大于基准记录的关键字,则此排序方法叫做( )。
数据结构(C语言)第八章 排序
直接插入排序过程
0 21 1 25 2 49 3 4 25* 16 5 08 temp
i=1
0 21
21
1 25
25 25
2 49
49 49
3 4 25* 16
25* 16 25* 16
5 08
08 08
temp 25
i=2
21
49
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
希尔排序 (Shell Sort)
基本思想设待排序对象序列有 n 个对象, 首 先取一个整数 gap < n 作为间隔, 将全部对 象分为 gap 个子序列, 所有距离为 gap 的对 象放在同一个子序列中, 在每一个子序列中 分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划 分和排序工作。直到最后取 gap == 1, 将所 有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。
第八章 排序
概述
插入排序
交换排序 选择排序 归并排序 基数排序 各种内排方法比较
概 述
排序: 将一个数据元素的任意序列,重新
排列成一个按关键字有序的序列。
数据表(datalist): 它是待排序数据对象的
有限集合。
主关键字(key): 数据对象有多个属性域,
即多个数据成员组成, 其中有一个属性域可用 来区分对象, 作为排序依据,称为关键字。也 称为关键字。
直接插入排序 (Insert Sort)
基本思想 当插入第i (i 1) 个对象时, 前面的 R[0], R[1], …, R[i-1]已经排好序。这时, 用 R[i]的关键字与R[i-1], R[i-2], …的关键字顺 序进行比较, 找到插入位臵即将R[i]插入, 原 来位臵上的对象向后顺移。
数据结构 排序讲解
i=2 38 (38 49) 65 97 76 13 27 i=3 65 (38 49 65) 97 76 13 27 i=4 97 (38 49 65 97) 76 13 27 i=5 76 (38 49 65 76 97) 13 27 i=6 13 (13 38 49 65 76 97) 27 i=7 27 (13 27 49 65 65 76 97 38 38 49 76 97) 27 排序结果: j 排序结果:(13 j27 j38 j49 j65 j76 97)
正序表与逆序表:若有序表是按关键字升序排列的, 正序表与逆序表:若有序表是按关键字升序排列的, 则称为升序表或正序表,否则称为降序表或逆序表。 则称为升序表或正序表,否则称为降序表或逆序表。 不失普遍性,一般只讨论正序表。 不失普遍性,一般只讨论正序表。
数据结构 排序的方法: 排序的方法: 插入排序:直接插入排序、折半插入排序、 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、 选择排序:简单选择排序、堆排序 归并排序: 路归并排序 归并排序:2-路归并排序 其它排序: 其它排序 多关键字排序
排序基本操作: 排序基本操作: 比较两个关键字大小 将记录从一个位置移动到另一个位置
8.2 插入排序
直接插入排序
数据结构
排序过程:整个排序过程为 趟插入 趟插入, 排序过程:整个排序过程为n-1趟插入,即先将序 列中第1个记录看成是一个有序子序列 然后从第2 个记录看成是一个有序子序列, 列中第 个记录看成是一个有序子序列,然后从第 个记录开始,逐个进行插入,直至整个序列有序。 个记录开始,逐个进行插入,直至整个序列有序。 例:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)编写结果实现上述排序过程的算法。7.采用单链表作存储结构,编写一个采用选择排序方法进行升序排序的函数。8.利用一维数组A可以对n个整数进行排序。其中一种排序算法的处理思想是:将n个整数分别作为数组A的n个记录的值,每次(即第i次)从记录A[i]-A[n]中挑选出最小
(1)(25,84,21,47,15,27,68,35,40)
(2)(20,15,21,25,47,27,68,35,84)
(3)(15,20,21,25,35,27,47,68,84)
(4)(15,20,21,25,27,35,47,68,84)则所采用的排序方法是()。
A.选择排序B.希尔排序C.归并排序D.快速排序
17.一组记录的关键字为(25,50,15,35,80,85,20,40,36,70),其中含有5个 长度为2的有序表,用归并排序方法对该序列进行一趟归并后的结果为()。
A.(15,25,35,50,20,40,80,85,36,70)
B.(15,25,35,50,80,20,85,40,70,36)
C.顺序或链表D.二叉树
13.排序方法中,从未排序序列中依次取出记录与已排序序列(初始时为空)中的记 录进行比较,将其放入已排序序列的正确位置上的方法,称为()。
A.希尔排序B.冒泡排序C.插入排序D.选择排序
14.每次把待排序的记录划分为左、右两个子序列,其中左序列中记录的关键字均小 于等于基准记录的关键字, 右序列中记录的关键字均大于基准记录的关键字, 则此排序方法 叫做()。
25.C,A 26.B
27.
B,D 28.C
29.D
30.D
31.C
32.B
33.C
34.D
35.C
、选择题
7.
B
13. n-l。
三、简答题
1.采用冒泡排序法排序的各趟的结果如下: 初始:17, 18, 60, 40,7,32,73, 65, 85 l趟:17, 18, 40,7,32, 60, 65, 73, 85 2趟:17, 18,7,32, 40, 60, 65, 73, 85 3趟:17,7,18, 32, 40, 60, 65, 73, 85 4趟:7, 17, 18, 32, 40, 60, 65, 73, 85 5趟:7, 17, 18, 32, 40, 60, 65, 73, 85第5趟无元素交换,则排序结束。
A.O(nlog 2 n) B.0(nlog2 k)
C.0 (klog2 n) D.0(k log 2 k)33.若要尽可能地完成对实数数组的排序,且要求排序是稳定的,则应选()。
A.快速排序B.堆排序
C.归并排序D.基数排序
34.在含有n个记录的大根堆(堆顶记录最大)中,关键字最小的记录可能存储在( )
A.(80,45,55,40,42,85)
B.(85,80,55,40,42,45)
C.(85,80,55,45,42,40)
D.(85,55,80,42,45,40) 26.下列序列中是堆的有( )。
A.(12,70,33,65,24,56,48,92,86,33)
B.(100,86,48,73,35,39,42,57,66,21)
A.堆排序B.快速排序C.冒泡排序D. Shell排序
15.排序方法中,从未排序序列中挑选记录,并将其依次放入已排序序列(初始时为 空)的一端的方法,称为()。
A.希尔排序B.归并排序C.插入排序D.选择排序
16.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,记 录序列的变化情况如下:
A.插入排序B.选择排序C.快速排序D.归并排序'
4.不稳定的排序方法是指在排序中,关键字值相等的不同记录的前后相对位置()。
A.保持不变B.保持相反C.不定D.无关5.内部排序是指在排序的整个过程中,全部数据都在计算机的()中完成的排序。
A.内存储器B.外存储器
C.内存储器和外存储器D.寄存器
6.用冒泡排序的方法对n个数据进行排序,第一趟共比较()对记录。
A.(40,42,45,55,80,85).
B.(42,40,45,80,55,85)
C.(42,40,45,55,80,85)
D.(42,40,45,85,55,80)
23.对n个记录的线性表进行快速排序, 为减少算法的递归深度, 以下叙述正确的是()。A.每次分区后,先处理较短的部分
B.每次分区后,先处理较长的部分
位置上。
A. Ln/21 B. Ln/2_1-1
C.1D. Ln/2_1+1
35.对任意的7个关键字迸行排序,至少要进行()次关键字之间的两两比较。
A.13 B.14
C.15 D.16
二、填空题
1.排序是将一组任意排列的记录按的值从小到大或从大到小重新排列成有序的
序列。
2.在排序前,关键字值相等的不同记录间的前后相对位置保持的排序方法称为
8.在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把 第7个记录60插入到有序表时,为寻找插入位置需比较 次。
9.在利用快速排序方法对一组记录(54,38,96,23,15,72,60,45,83)进行快速
排序时, 递归调用而使用的栈所能达到最大深度为,共递归调用的次数为,其
无序,则最好选用。
12.在考虑如何选择排序中,若初始数据基本正序,则选用;若初始数据基本
反序,则选用。
13.对n个记录的序列进行冒泡排序时,最少的比较次数是。
三、简答题
1.已知序列:{17,18,60,40,7,32,73,65,85),请给出采用冒泡排序法对该 序列作升序排序时每一趟的结果。
2.已知序列:{503,87,512,61,908,170,897,275,653,462),请给出采用快 速排序法对该序列作升序排序时每一趟的结果。
稳定的排序方法。
3.在排序前,关键字值相等的不同记录间的前后相对位置的排序方法称为不稳
定的排序方法。
4.外部排序是指在排序前被排序的全部数据都存储在计算机的存储器中。
5.写出一种不稳定的排序方法的名称。
6.在直接插入排序的方法中,当需要将第f个数据插入时,此时前i-l个数据是
的。
7.对一个基本有序的数据进行排序排序方法运算次数最小。
第八章排序:习题
习题
一、选择题
1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是()。
A.希尔排序B.冒泡排序C.插入排序D.选择排序
2.设有1000个无序的记录,希望用最快的速度挑选出其中前10个最大的记录,最好选
用( )排序法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.在待排序的记录序列基本有序的前提下,效率最高的排序方法是()。
A.堆排序B.冒泡排序C.快速排序D.插入排序
29.在含有n个记录的小根堆(堆顶记录最小)中,关键字最大的记录可能存储在( )
位置上。
A. Ln/21 B. Ln/2J-2 C.1 D. Ln/2_1+330.已知数据表A中每个记录距其最终位置不远,则采用()算法最省时间。
A.堆排序B.插入排序
C.直接选择排序D.快速排序
C.(15,25,50,35,80,85,20,36,40,70)
D.(15,25,35,50,80,20,36,40,70,85)
18.n个记录的直接插入排序所需记录关键码的最大比较次数为()。
A. nlog2n B. n2/2
C.(n+2)(n_1)/2D. n-l
19.n个记录的直接插入排序所需的记录最小移动次数为()。
21.快速排序在( )情况下最不利于发挥其长处,在()情况下最易发挥其长处。A.被排序的数据量很大
B.被排序的数据已基本有序
C.被排序的数据完全无序
D.被排序的数据中最大的值与最小值相差不大
E.要排序的数据中含有多个相同值
22.一组记录的关键字为(45,80,55,40,42,85),则利用快速排序的方法,以第一 个记录为基准得到一次划分结果是()。
中第二次递归调用是对组进行快速排序。
10.在堆排序、快速排序和归并排序中,若只从存储空间考虑,则应首先选取方法, 其次选取,最后选取方法;若只从排序结果的稳定性考虑,则应选取;若只
从平均情况下排序最快考虑, 则应选取;若只从最坏情况下排序最快并且要节省内存
考虑,则应选取方法。
11.在堆排序和快速排序中,若原始记录接近正序或反序,则选用,若原始记录
3趟:[61, 87] 170 [275] 462,503[897,908, 653, 512]
4趟:61 [87] 170 [275] 462,503 [897, 908, 653, 512]
2.采用快速排序法排序的各趟的结果如下:
初始:503, 87, 512, 61, 908, 170, 897, 275, 653, 462
l趟:[462, 87, 275, 61,170] 503 [897, 908, 653, 512]
2趟:[170,87, 275, 61] 462,503 [897,908, 653, 512]
C.与算法每次分区后的处理顺序无关
D.以上都不对
24.直接插入排序和冒泡排序的平均时间复杂度为(),若初始数据有序(即正序),
则时间复杂度为()。
A.0(n)B.0(log2n) C.0(nlog2n) D. O(n2)
25.一组记录的关键字为(45,80,55,40,42,85),则利用堆排序的方法建立的初始 堆为()。
5.已知序列:{70,83,100,65,10,32,7,9),请给出采用插入排序法对该序列 作升序排序时每一趟的结果。