实验三内部排序算法效率的比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三内部排序算法效率的比较
一、实验目的:
了解不同排序算法的时间效率
了解先进的排序算法与简单的排序算法的差别
掌握希尔排序算法
掌握快速排序算法
掌握堆排序算法
能够根据实际问题选择合适的算法
二、实验内容与要求:
⏹希尔排序和直接插入排序
⏹快速排序和冒泡排序
⏹堆排序和直接选择排序
要求:
编写实验程序,对随机生成的n个整数分别采用两种排序方法进行排序,并分别统计每种排序算法中的关键字比较次数。
通过进行多组实验(m组),统计每种算法的平均比较次数。
程序要具有灵活性。m、n值应在运行时确定
重点观察当n增大时两种算法的差别。
三、提示:
实验分两步进行:
步骤1.
首先编写排序算法,令n=10,显示排序结果,目的是查看排序算法是否正确。
步骤2.
修改教材中的排序算法,增加对“关键字比较次数”和“记录移动次数”统计的语句。
建议使用全局变量作为计数器。比较100个、1000个数据的排序效率
四、参考程序
1.希尔排序和直接插入排序的比较实验程序
# define maxnum 5000 /*排序记录的个数限制为5000*/
# include
# include
typedef int KeyType; /*定义关键字为整型*/
typedef struct
{ KeyType key;
int data; /*其他信息略*/
} RecordType;
long compare=0; /*shellsort关键字比较次数*/
long compare1=0; /*直接插入的关键字比较次数*/ long move=0; /*shellsort记录移动次数*/
long move1=0; /*直接插入记录移动次数*/
void ShellInsert(RecordType r[],int n,int d)
{ int i,j;
for (i=d+1; i<=n; i++)
{
if ( r[i].key { r[0].key=r[i].key; /*暂存r[i]*/ for (j=i-d; j>0 && r[0].key { r[j+d]=r[j]; /* 记录后移,找插入位置 */ compare++; /*记录比较次数*/ } r[j+d]=r[0]; /* 插入记录 */ } } } /*希尔排序过程:通过多次调用一趟插入排序实现 */ void ShellSort(RecordType r[],int n,int d[],int m) /* 对数组r中记录进行排序, n为数组r的长度,d为增量序列,m为d的长度 */ { int k; for ( k=0; k } /*直接插入排序*/ void Insertsort(RecordType r[],int n) { int i,j; for (i=2; i<=n; i++) { r[0]=r[i]; for (j=i-1; r[0].key { r[j+1]=r[j]; compare1++; /*记录比较次数* } r[j+1]=r[0]; } } main() { RecordType r[maxnum+1],bf[maxnum+1]; double shell_com=0, Ins_com=0; int i,times,m,d[10],n; /*d为希尔排序的增量序列,m为其长度*/ clrscr(); printf("\n input times :"); /*实验组数,最后取平均值*/ scanf("%d",×); printf("\n input number(<1000) :"); /*读入待排序的数据个数*/ scanf("%d",&n); printf("\n input the len of INC_serial(<10) :"); scanf("%d",&m); /*读入增量序列长度*/ printf("\n input the searil :"); for (i=0; i randomize(); /*初始化随机数发生器*/ while (times>0) { /*生成待排序的n个数据,注意保存初始数据*/ for (i=1; i<=n; i++) { r[i].key=bf[i].key=rand()%1000; /* printf("%d ",r[i].key);*/ } /*对随机生成的数据进行希尔排序,显示所进行的关键字比较次数*/ compare=0; ShellSort(r,n,d,m); printf("\nshell: compare=%.0f",compare); shell_com+=compare; /*对随机生成的数据进行直接插入排序,所需关键字比较次数*/ compare1=0; Insertsort(bf,n); printf("\tInsert: compare=%.0f",compare1); Ins_com+=compare1; times--; } /*显示对times组数据排序的平均比较次数*/ printf("\nShellsort comparing number=%.0f”,shell_com/m); printf("\nInsertsort comparing number=%.0f",Ins_com/m); }