当前位置:文档之家› 内部排序算法的实现与比较

内部排序算法的实现与比较

实验四:内部排序算法的实现与比较
一、问题描述
1.实验题目:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。

试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。

2.基本要求:(1)对常用的内部排序算法进行比较:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序。

(2利用随机函数产生N(N=30000)个随机整数,作为输入数据作比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。

(3)对结果作出简要分析。

3.测试数据:随机函数产生。

二、需求分析
1.程序所能达到的基本可能:通过随机数据产生N个随机数,作为输入数据作比较;对常用的内部排序算法:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序进行比较:比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。

最后结果输出各种排序算法的关键字参加的比较次数和关键字的移动次数,并按从小到大排列。

2.输入的形式及输入值范围:随机函数产生的N(N=30000)个随机整数。

3.输出的形式:输出各种排序算法的关键字参加的比较次数和关键字的移动次数。

并按从小到大排列。

4.测试数据要求:随机函数产生的N(N=30000)个随机整数。

三、概要设计
1. 所用到得数据结构及其ADT
为了实现上述功能,应以一维数组表示集合数据类型。

int s[N];
int compare[6]={0},move[6]={0},D[N]={0},RS[N]={0};
基本操作:
数组赋值:
for(i=1;i<N;i++)
{
s[i]=rand()%100;
printf("%d\t",s[i]);
}
void copys(int S[],int RS[],int n)
实现每个操作的伪码,重点语句加注释
1)void copys(int S[],int RS[],int n)择法 ,2.冒泡法 ,3.插入法 ,4.快速法 , 5.希尔排序法 ,6.归并排序法,7.输出比较信息,8.退出\n");
scanf(" %d",&j);
switch(j)
{
case 1:
SelectSort(RS,N-1);
break;
case 2:
BubbleSort(RS,N-1);
break;
case 3:
InsertSort(RS,N-1);
break;
case 4:
QuickSortprint(RS,N-1);
break;
case 5:
Shellsort(RS,N-1);
break;
case 6:
MSort(RS,1,N-1);
printf("归并排序后的结果:");
for(i=1;i<N;i++)
printf("%d\t",D[i]);
printf("\n");
printf("关键字参加的比较次数:%d,关键字的移动次数:%d\n",compare[5],move[5]);
printf("\n");
break;
case 7:
SelectSort(compare,5);
SelectSort(move,5);
printf("关键字参加的比较次数:\n");
for(i=1;i<=5;i++)
printf("%d\t",compare[i]);
printf("\n");
printf("关键字的移动次数:\n");
for(i=1;i<=5;i++)
printf("%d\t",move[i]);
printf("\n");
break;
case 8:
printf("Current local time and date:%s",asctime(timeinfo));
exit(0);
break;
}
}while(1);
}
五、调试分析
1. 设计与调试过程中遇到的问题分析、体会
调试过程:由于本次程序设计的数据和模块比较多,所以采用分块调试的方法,在编写完一个内部排序算法后,为了验证是否排序成功以及所输出的关键字比较次数和移动次数是否正确,采用先定义一个需要排序9个数字的数组,S[10]={0,1,2,3,4,5,6,7,8,9}和S[10]={0,9,8,7,6,5,4,3,2,1},用这两个数组检验程序的正确性与否。

调试步骤,程序及相关结果如下:
1)直接选择排序:
#include <>
#include <>
#include <>
void SelectSort(int RS[],int n)
择法 ,2.
冒泡法 ,3.插入法 ,4.快速法 , 5.希尔排序法 ,6.归并排序法,7.输出比较信息,8.退出\n");
scanf(" %d",&j);
switch(j)
{
case 1:
SelectSort(RS,N-1);
break;
case 2:
BubbleSort(RS,N-1);
break;
case 3:
InsertSort(RS,N-1);
break;
case 4:
QuickSortprint(RS,N-1);
break;
case 5:
Shellsort(RS,N-1);
break;
case 6:
MSort(RS,1,N-1);
printf("归并排序后的结果:");
for(i=1;i<N;i++)
printf("%d\t",D[i]);
printf("\n");
printf("关键字参加的比较次数:%d,关键字的移动次数:%d\n",compare[5],move[5]);
printf("\n");
break;
case 7:
SelectSort(compare,5);
SelectSort(move,5);
printf("关键字参加的比较次数:\n");
for(i=1;i<=5;i++)
printf("%d\t",compare[i]);
printf("\n");
printf("关键字的移动次数:\n");
for(i=1;i<=5;i++)
printf("%d\t",move[i]);
printf("\n");
break;
case 8:
printf("Current local time and date:%s",asctime(timeinfo));
exit(0);
break;
}
}while(1);
]
九、实验收获和感想。

相关主题