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

发布时间 : 星期三 文章《第9章 内部排序》习题解答更新完毕开始阅读

第9章 内部排序

第9章内部排序

本章学习要点

◆熟悉并掌握本章中各种内部排序方法的基本思想及其实现过程

◆掌握各种内部排序算法的时间复杂度和空间复杂度的计算和分析方法 ◆了解各种内部排序方法的优缺点以及其不同的应用场合

◆要求能够针对实际问题的特点选择合理的排序算法并通过编程实现

排序(Sorting)是计算机程序设计中的一种重要运算,它的功能是将一组数据元素按照其关键字的某种规定顺序(递增或递减)进行排列。对数据元素进行排序的目的是为了便于查找,在关键字有序的一组数据中的查找要比无序时更容易,速度也更快。

本章主要介绍几种常用的内部排序方法,主要有:插入排序、交换排序、选择排序、归并排序和基数排序。最后对各种排序算法的时间复杂度和空间复杂度进行了分析和比较,并且讨论了如何针对实际问题合理选择排序算法等内容。

9.1排序的有关概念和数组的输入与输出

9.1.1排序的概念

1.排序

将一个数据元素的任意序列,重新排列成一个按关键字有序(递增有序或递减有序)的序列的过程叫排序。

2.排序方法的稳定性

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

3.内部排序和外部排序

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

4.排序方法的性能分析

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

5.数据元素类型说明

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

-.275.-

第9章 内部排序

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

9.1.2一维数组的输入与输出

1.数组输入操作

函数void Input(int *A,int n)的功能是,从键盘输入n个整数到数组A[]中。 #include\void Input(int *A,int n) { int i; cout<<\请输入\个整数:\\n\ for(i=0;i>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

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<<\排序后的顺序\Out(A,n); delete[]A;

9.2插入排序法

-.276.-

第9章 内部排序

9.2.1直接插入排序(Straight Insertion Sort)

1.算法思想

对于任意排列的序列(a0,a1,a2,…,an-1),先将第一个记录看成是一个有序序列L1=(a0),再将第2个记录插入到L1中得到有序序列L2=(a0,a1),?,一般的,将第k+1个记录插入到有序序列Lk中得到有序序列Lk+1,如此重复插入n-1次即可得到有序序列Ln=(a0,a1,a2,…,an-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

3.算法实现

void InsertSort(int A[],int n) { int temp,i,j; for(i=0;i0;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)使用直接插入排序算法排序时可能出现下列情况:在最后一趟开始之前,所有的元素都不在其最终的位置上。比如,初始序列的最后一个元素为最小元素时就会出现以上情况。

第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)

*9.2.2折半插入排序

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

-.277.-

第9章 内部排序

1.折半插入排序函数

void InertSort1(int a[],int n) { int i,j,k,t,l,h; for(i=1;it;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]

(2) 调用函数Found()实现插入排序。 void InertSort2(int a[],int n) { int i,j,x,t; for(i=1;i

-.278.-

联系合同范文客服:xxxxx#qq.com(#替换为@)