1、实验四:内部排序算法的实现与比较一、 问题描述 1 实验题目:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。2 基本要求:(1)对常用的内部排序算法进行比较:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序。(2 利用随机函数产生 N(N=30000)个随机整数,作为输入数据作比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为 3 次移动) 。(3)对结果作出简要分析。3 测试数据:随机函数产生。二、 需求分析 1 程序所能达到的基本可能
2、:通过随机数据产生 N 个随机数,作为输入数据作比较;对常用的内部排序算法:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序进行比较:比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为 3 次移动) 。最后结果输出各种排序算法的关键字参加的比较次数和关键字的移动次数,并按从小到大排列。2 输入的形式及输入值范围 :随机函数产生的 N(N=30000)个随机整数。3 输出的形式:输出各种排序算法的关键字参加的比较次数和关键字的移动次数。并按从小到大排列。4 测试数据要求:随机函数产生的 N(N=30000 )个随机整数。三、 概要设计 1. 所用到得数据结构及其
3、 ADT 为了实现上述功能,应以一维数组表示集合数据类型。 int sN; int compare6=0,move6=0,DN=0,RSN=0;基本操作: 数组赋值:for(i=1;i = R S 0 c o m p a r e 3 + + ;c o m p a r e 3 + + ;j iR S i = R S j ;m o v e 3 + + ;i + + ;R S i ii + + ;c o m p a r e 3 + + ;c o m p a r e 3 + + ; j iR S j = R S i ;m o v e 3 + + ;j - - ;R S i = R S 0 ;m o v
4、 e 3 + + ;l o w = m m = ( m = = 2 ? 1 : ( m / 2 ) ) ;输出排序后结果结束YNvoid Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列开始i = l o w ;j = m i d + 1 ;k = l o w ;i =RS0compare3+;compare3+;if(ji)RSi=RSj;move3+;i+;while(RSii)i+;compare3+;compare3+;if(ji)RSj=RSi;move3+;j-;RSi=RS0;move3+;if(low=mm=(m=2
5、?1:(m/2);/缩小增进量printf(“希尔排序后的结果:“);for(i=1;i #include #include void SelectSort(int RS,int n) /直接选择排序int i,j,k,move=0,compare=0;for(i=1;i #include #include #define False 0#define True 1void BubbleSort(int RS,int n)/冒泡排序int i,j,flag,move=0,compare=0;for(i=1;i #include #include #define False 0#define T
6、rue 1void InsertSort(int RS,int n) /直接插入排序int i,j,compare=0,move=0;for(i=2;i #include #include #define False 0#define True 1int compare6=0,move6=0;int QuickSort(int RS,int low,int high)/快速排序int i,j,n;n=high;i=low;j=high;RS0=RSi;move3+;while(i=RS0compare3+;compare3+;if(ji)RSi=RSj;move3+;i+;while(RSii
7、)i+;compare3+;compare3+;if(ji)RSj=RSi;move3+;j-;RSi=RS0;move3+;if(low #include #include #define False 0#define True 1int compare6=0,move6=0;void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔 m 划分子序列int i,j,temp;for(i=m;i=mm=(m=2?1:(m/2);/缩小增进量printf(“希尔排序后的结果:“);for(i=1;i #include #include #define False
8、0#define True 1int compare6=0,move6=0,D10=0;void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列int i,j,k;int n1,n2;i=low;j=mid+1;k=low;while(i #include #include #include #define N 100#define False 0#define True 1int compare6=0,move6=0,DN=0,RSN=0;void copys(int S,int RS,int n)int i;for(i=1;i=RS0compare3+;compare3+;if(ji)RSi=RSj;move3+;i+;while(RSii)i+;compare3+;