《第9章内部排序》习题解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<<"请输入"< for(i=0;i } 2.数组输出操作 函数void Output(int A[],int n)的功能是,依次显示输出数组A[]中的n个整数。 void Output(int A[],int n) { int i; cout<<"结果为:\n"; for(i=0;i cout< } 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 { 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)。