《第9章内部排序》习题解答

合集下载

《数据结构》第九章习题参考答案

《数据结构》第九章习题参考答案

《数据结构》第九章习题参考答案《数据结构》第九章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、快速排序是一种稳定的排序方法。

(×)2、在任何情况下,归并排序都比简单插入排序快。

(×)3、当待排序的元素很大时,为了交换元素的位置,移动元素要占用较多的时间,这是影响时间复杂度的主要因素。

(√)4、内排序要求数据一定要以顺序方式存储。

(×)5、直接选择排序算法在最好情况下的时间复杂度为O(n)。

( ×)6、快速排序总比简单排序快。

( ×)二、单项选择题1.在已知待排序文件已基本有序的前提下,效率最高的排序方法是(A)。

A.直接插入排序B.直接选择排序C.快速排序D.归并排序2.下列排序方法中,哪一个是稳定的排序方法?(B)A.直接选择排序B.折半插入排序C.希尔排序D.快速排序3、比较次数与排序的初始状态无关的排序方法是( B)。

A.直接插入排序B.起泡排序(时间复杂度O(n2))C.快速排序D.简单选择排序4、对一组数据(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)。

A. 选择B. 冒泡C. 快速D. 插入5、快速排序方法在(D)情况下最不利于发挥其长处。

A. 要排序的数据量太大B. 要排序的数据中含有多个相同值C. 要排序的数据个数为奇数D. 要排序的数据已基本有序6、用某种排序方法对线性表{25,84,21,47,15,27,68,35,20}进行排序,各趟排序结束时的结果为:(基准)20,21,15,25,84,27,68,35,47(25)15,20,21,25,47,27,68,35,84(左20右47)15,20,21,25,35,27,47,68,84(左35右68)15,20,21,25,27,35,47,68,84 ;则采用的排序方法为(C)。

中国农业大学_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}从大到小排序,需进行()次比较。

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

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

习题九排序一、单项选择题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}从大到小排序,需进行()次比较。

数据结构 第9章(内排序)

数据结构 第9章(内排序)

3. 将R[j+1]=R[0] 实现整个序列的排序。
North China Electric Power University
排序算法如下:
void insort(List r, int n) {//r为给定的表,其记录为r[i],i=0,1,…,n,x为暂存单元。 for (i=2; i<=n; i++) { r[0]=r[i]; //r[0]作为标志位 j=i-1; while (r[0].key<r[j].key) { r[j+1]=r[j]; j--; } //j从i-1至0,r[j].key与r[i].key进行比较 r[j+1]=r[0]; } }//insort
North China Electric Power University
例如:
第二趟希尔排序,设增量d = 3
第三趟希尔排序,设增量d = 1
North China Electric Power University
希尔排序的算法描述如下:
void ShellInsert (List r,int d) //本算法对直接插入算法作了以下修改: // 1. 前后记录位臵的增量是d,而不是1; // 2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位臵已找到。 for (i=2;i<= n ; i++) { { r[0]=r[i]; for(i=d+1;i<=n;i++) j=i-1; if ( r[i] < r[i-d]) //需将r[i]插入有序增量子表 while ( r[0].key<r[j].key) { r[0] = r[i]; //暂存在R[0] { r[j+1]=r[j]; j=i-d ; j=j-1; while ((j>0) and (r[0] < r[j])) } { r[j+d] = r[j]; //记录后移,查找插入位臵 r[j+1]=r[0]; j=j-d; } } r[j+d] = r[0];//插入 } }

数据结构 第9章 内部排序(作业)

数据结构  第9章 内部排序(作业)
void BInsertSort(SqList &L) { // 对顺序表L作折半插入排序。算法10.2 for(i=2;i<=L.length;++i) { L.r[0]=L.r[i]; // 将L.r[i]暂存到L.r[0] low=1; high=i-1; while(low<=high) { // 在r[low..high]中折半查找有序插入的位置 m=(low+high)/2; // 折半 if LT(L.r[0].key,L.r[m].key) high=m-1; //插入点在低半区 else low=m+1; // 插入点在高半区 } for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; // 记录后移 L.r[high+1]=L.r[0]; // 插入 } }
第9章 内部排序
为了讨论方便,假设待排记录的关键字均为整数,均从 数组中下标为1的位置开始存储,下标为0的位置存储监视哨, 或空闲不用。 typedef int KeyType; typedef struct { KeyType key; OtherType other-data; } RecordType;
类: 一类是整个排序过程完全在内存中进行,称为内部排序; 另一类是由于待排序记录数据量太大,内存无法容纳全部数 据, 排序需要借助外部存储设备才能完成,称为外部排序。
第9章 内部排序
假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j), 若在排序前的序列中Ri
领先于Rj(即i<j),经过排序后得到的序列中Ri仍领先于Rj, 则 称所用的排序方法是稳定的;反之,当相同关键字的领先关系 在排序过程中发生变化,则称所用的排序方法是不稳定的。 无论是稳定的还是不稳定的排序方法,均能排好序。在应 用排序的某些场合,如选举和比赛等,对排序的稳定性是有特 殊要求的。

数据结构(内排序)练习题与答案

数据结构(内排序)练习题与答案

1、以下关于排序的叙述中正确的是()。

A.排序方法都是在顺序表上实现的,在链表上无法实现排序方法B.稳定的排序方法优于不稳定的排序方法,因为稳定的排序方法效率较高C.在顺序表上实现的排序方法在链表上也同样适合D.对同一个顺序表使用不同的排序方法进行排序,得到的排序结果可能不同正确答案:D解析: D、稳定的排序方法的效率不一定都比不稳定的排序方法高。

有些排序方法既可以上顺序表上实现,也可以在链表上实现,但不是所有的排序方法都如此。

由于排序方法具有不同的稳定性,所以对同一个顺序表(存在相同的多个关键字记录)使用不同的排序方法进行排序,得到的排序结果可能不同。

2、以下不属于内排序方法的是()。

A.直接插入排序B.拓扑排序C.二路归并排序D.堆排序正确答案:B解析: B、拓扑排序是一种产生拓扑序列的方法,不属内排序方法。

3、目前来讲,基于比较的内排序方法最好的平均时间复杂度为()。

A. O(log2n)B. O(n2)C. O(nlog2n)D. O(n)正确答案:C解析: C、目前来讲,基于比较的内排序方法最好的平均时间复杂度为O(nlog2n)。

4、对有n个记录的表进行直接插入排序,在最好情况下需比较()次关键字。

A.n(n-1)/2B.n-1C.n/2D.n+1正确答案:B解析: B、直接插入排序在初始数据正序时效率最好,此时只需要n-1次关键字比较。

5、数据序列{8,9,10,4,5,6,20,1,2}只能是()算法的两趟排序后的结果。

A.堆排序B.简单选择排序C.冒泡排序D.直接插入排序正确答案:D解析: D、采用排除法,因为两趟排序后结果中的有序区不是全局有序的,所以只能是直接插入排序,不可能是其他三种排序方法。

6、对数据序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排序变为{4,9,-1,8,20,7,15},则采用的是()算法。

A.冒泡排序B.希尔排序C.快速排序D.简单选择排序正确答案:B解析: B、因为一趟排序后结果中的有序区不是全局有序的,所以不可能是简单选择排序和冒泡排序。

第九章排序练习题及答案

第九章排序练习题及答案

置上。
A 归并排序
B 插入排序
C 快速排序
D 选择排序
17.将上万个一组无序并且互不相等的正整数序列,存放于顺序存储结构中,采用( )
方法能够最快地找出其中最大的正整数。
A 快速排序
B 插入排序
C 选择排序
D 归并排序
18 一般情况下,以下四种排序方法中,平均查找长度最小的是
()
A 归并排序
B 快速排序
1a直接插入排序序号101112关键字834063138435965739796115408363138435965739796115406383138435965739796115134063838435965739796115134063838435965739796115133540638384965739796115133540638384965739796115133540576383849639796115133539405763838496796115101335394057637983849661151113353940576163798384961512131535394057616379838496直接选择排序序号101112关键字8340631384359657397961151340638384359657397961151315638384359657397961401315358384639657397961401315353984639657837961401315353940639657837961841315353940579663837961841315353940576163837996841315353940576163837996841315353940576163798396841013153539405761637983968411131535394057616379838496快速排序关键字834063138435965739796115第一趟排序后154063136135795739839684第二趟排序后131563406135795739838496第三趟排序后131539406135576379838496第四趟排序后131535396140576379838496第五趟排序后131535395740616379838496第六趟排序后131535394057616379838496第七趟排序后131535394057616379838496堆排序关键字
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章内部排序本章学习要点◆熟悉并掌握本章中各种内部排序方法的基本思想及其实现过程◆掌握各种内部排序算法的时间复杂度和空间复杂度的计算和分析方法◆了解各种内部排序方法的优缺点以及其不同的应用场合◆要求能够针对实际问题的特点选择合理的排序算法并通过编程实现排序(Sorting)是计算机程序设计中的一种重要运算,它的功能是将一组数据元素按照其关键字的某种规定顺序(递增或递减)进行排列。

对数据元素进行排序的目的是为了便于查找,在关键字有序的一组数据中的查找要比无序时更容易,速度也更快。

本章主要介绍几种常用的内部排序方法,主要有:插入排序、交换排序、选择排序、归并排序和基数排序。

最后对各种排序算法的时间复杂度和空间复杂度进行了分析和比较,并且讨论了如何针对实际问题合理选择排序算法等内容。

9.1排序的有关概念和数组的输入与输出9.1.1排序的概念1.排序将一个数据元素的任意序列,重新排列成一个按关键字有序(递增有序或递减有序)的序列的过程叫排序。

2.排序方法的稳定性若在排序过程中,序列的两个关键字值相同的记录的相对位置不发生改变,则称所用的排序方法为稳定的;反之,若在某个序列的排序过程中关键字值相同的记录的相对位置发生了改变,则称所用的排序方法是不稳定的。

3.内部排序和外部排序在排序过程中,如果待排序列全部读入计算机存储器中,则称此为内部排序;反之,若待排序列仅有部分记录在内存中,在排序过程中还要对外存中的纪录进行访问,这样的排序过程叫外部排序。

4.排序方法的性能分析对于所选用的排序方法的好坏主要是基于其算法的时间复杂度和空间复杂度两方面进行分析。

5.数据元素类型说明数据元素可以是任意一个结构类型,排序过程是按元素中的某个关键字(数据项)进行排序。

不失一般性,我们在本章的所有例题中总是假定待排序列中的数据元素中只含有关键字项,且其数据类型为整型。

9.1.2一维数组的输入与输出1.数组输入操作函数void Input(int *A,int n)的功能是,从键盘输入n个整数到数组A[]中。

#include"iostream.h"void Input(int *A,int n){ int i;cout<<"请输入"<<n<<"个整数:\n";for(i=0;i<n;i++) cin>>A[i];}2.数组输出操作函数void Output(int A[],int n)的功能是,依次显示输出数组A[]中的n个整数。

void Output(int A[],int n){ int i;cout<<"结果为:\n";for(i=0;i<n;i++)cout<<A[i]<<" ";cout<<endl;}3.数组排序操作函数void MainSort(void(*sort)(int*,int))的功能是,首先通过函数调用Input(A,n)输入n个整数到数组A[]中,再通过函数调用sort(A,n)对A[]中的n个整数排序,最后通过函数调用Out(A,n)显示输出数组A[]中的n个整数。

void MainSort(void(*sort)(int*,int)){ int *A,n;cout<<"请输入整数的个数:\n";cin>>n; A=new int[n];Input(A,n);cout<<"原顺序"; Output(A,n);sort(A,n); //调用sort对数组A进行处理cout<<"排序后的顺序"; O ut(A,n);delete[]A;}9.2插入排序法9.2.1直接插入排序(Straight Insertion Sort)1.算法思想对于任意排列的序列(a0,a1,a2,…,a n-1),先将第一个记录看成是一个有序序列L1=(a0),再将第2个记录插入到L1中得到有序序列L2=(a0,a1),, 一般的,将第k+1个记录插入到有序序列L k中得到有序序列L k+1,如此重复插入n-1次即可得到有序序列L n=(a0,a1,a2,…,a n-1)。

2.举例说明设原始序列为:8、3、5、2、9、7、*5、4第1轮:(8) 3,5,2,9,7,*5,4 第2轮:(3,8) 5,2,9,7,*5,4 第3轮:(3,5,8) 2,9,7,*5,4 第4轮:(2,3,5,8) 9,7,*5,4 第5轮:(2,3,5,8,9) 7,*5,4 第6轮:(2,3,5,7,8,9) *5,4 第7轮:(2,3,5,*5,7,8,9) 4 第8轮:(2,3,4,5,*5,7,8,9)3.算法实现void InsertSort(int A[],int n){ int temp,i,j;for(i=0;i<n-1;i++){ for(temp=A[i+1],j=i+1;j>0;j--){ if(temp>=A[j-1])break;A[j]=A[j-1];}A[j]=temp; //将temp插入到相应的位置}}4.算法分析从排序过程可知该算法是稳定的;算法的比较次数为f(n)=1+2+3+…+n-1,所以该算法的时间复杂度为T(n)=O(n2);由于在排序过程中仅有一个辅助变量(temp),所以该算法的空间复杂度为S(n)=O(1)。

说明:(1)从算法的基本操作部分可以看出,当待排序数组A[n]基本有序时可以大大减少其比较的执行次数,所以该算法适用于序列为基本有序的场合。

(2)使用直接插入排序算法排序时可能出现下列情况:在最后一趟开始之前,所有的元素都不在其最终的位置上。

比如,初始序列的最后一个元素为最小元素时就会出现以上情况。

*9.2.2折半插入排序折半插入排序是直接插入排序的一个改进算法,该算法在排序过程中,通过折半查找法来实现寻找插入位置的操作,从而减少了数据元素中关键字的比较次数。

1.折半插入排序函数void InertSort1(int a[],int n){ int i,j,k,t,l,h;for(i=1;i<n;i++)if(a[i]<a[i-1]){ l=0;h=i-1;while(l<=h) //用二分法查找插入位置{ t=(l+h)/2;if(a[t]==a[i])break;else if(a[t]<a[i])l=t+1;else h=t-1;}if(h<l)t=l; //查找失败for(k=a[i],j=i;j>t;j--)a[j]=a[j-1];a[j]=k;}}2.分步实现折半查找插入排序(1) 函数int Found(int A[],int n,int x)通过折半查找法求元素x在数组A[n]中的插入下标。

int Found(int A[],int n,int x){ int t,l,h;l=0;h=n-1;if(x>=A[h])t=n;else if(x<=A[0])t=0;else{ while(l<=h){ t=(l+h)/2;if(A[t]==x)break;else if(A[t]<x)l=t+1;else h=t-1;}if(h<l)t=l;}return t;}(2) 调用函数Found()实现插入排序。

void InertSort2(int a[],int n){ int i,j,x,t;for(i=1;i<n;i++){ x=a[i]; t=Found(a,i,x);for(j=i;j>t;j--) a[j]=a[j-1];a[t]=x;}}9.2.3 希尔排序法(Shell Sort)1.算法思想先将整个待排的n个记录序列按照某个间隔值d1(通常取n/2)分割成为若干个子序列,, 再对其分别进行直接插入排序,下一步取间隔值d2<d1(通常取d i+1=d i/2)重复前面的过程,直到间隔值为1时对整体序列进行最后一次直接插入排序。

2.举例说明设原始序列为:7、5、9、13、10、2、3、*5、8、1,其长度为n=10。

第1轮:取间隔值d=10/2=5,先将序列看成如图9.1(a)所示的5个子序列:(7,2)(5,3)(9,*5)(13,8)(10,1)。

再分别对每个子序列进行插入排序,其结果为如图9.1(b)所示的子序列:(2,7)(3,5)(*5,9)(8,13)(1,10)。

第1轮排序结果为:2,3,*5,8,1,7,5,9,13,10(注意:在对各子序列排序时,子序列在主序列中的相对位置不变)。

第2轮:取间隔值d=5/2=2,先将序列分成如图9.2(a)所示的2个子序列:(2,*5,1,5,13)(3,8,7,9,10)。

再分别进行插入排序,其结果为如图9.2(b)所示的子序列:(1,2,*5,5,13)(3,7,8,9,10)。

第2轮排序结果为:1,3,2,7,*5,8,5,9,13,10。

第3轮:取d=2/2=1,此时将整体序列进行一次直接插入排序。

第3轮排序结果为:1,2,3,*5,5,7,8,9,10,13。

3.算法实现(1) 算法Insert(A,k,n)的功能是,对数组A[n]按间隔k进行分组插入排序void Insert(int A[],int k,int n){ int i,j,temp;for(i=k-1;i<n-1;i++){ //A[i+1]为要插入的元素for(temp=A[i+1],j=i+1;j-k>=0;j-=k){ //在相应的子序列中寻找插入位置。

if(temp>=A[j-k])break;A[j]=A[j-k];}A[j]=temp; //将temp插入到相应的位置}}(2) 希尔排序函数void ShellSort(int A[],int n){ int k=n;while(k=k/2){ Insert(A,k,n); }}4.算法分析该算法是不稳定的;希尔排序算法的时间复杂度与间隔值d的取法有关,当取d1=n,d i+1=d i/2(i=1,2,3,…)时,该算法的时间复杂度为T(n)=O(nlog2n),空间复杂度为S(n)=O(1)。

9.3交换排序法交换排序是借助于交换操作来完成的排序方法。

它的基本思想是:在待排序的序列中,找到不满足序性的两个关键字,交换相应元素的相对位置,以满足序性;重复该过程,直到序列中所有元素的关键字都有序为止。

相关文档
最新文档