您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页实验三内部排序算法效率的比较

实验三内部排序算法效率的比较

来源:保捱科技网
少年易学老难成,一寸光阴不可轻 -

实验三 内部排序算法效率的比较

一、实验目的:

了解不同排序算法的时间效率

了解先进的排序算法与简单的排序算法的差别 掌握希尔排序算法 掌握快速排序算法 掌握堆排序算法

能够根据实际问题选择合适的算法

二、实验内容与要求:

 希尔排序和直接插入排序  快速排序和冒泡排序  堆排序和直接选择排序 要求:

编写实验程序,对随机生成的n个整数分别采用两种排序方法进行排序,并分别统计每种排序算法中的关键字比较次数。

通过进行多组实验(m组),统计每种算法的平均比较次数。 程序要具有灵活性。m、n值应在运行时确定 重点观察当n增大时两种算法的差别。

206

少年易学老难成,一寸光阴不可轻 -

三、提示:

实验分两步进行: 步骤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关键字比较次数*/

207

少年易学老难成,一寸光阴不可轻 -

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[i]*/

for (j=i-d; j>0 && r[0].keyr[j+d]=r[j];

/* 记录后移,找插入位置 */

compare++; /*记录比较次数*/ }

r[j+d]=r[0]; } } }

/*希尔排序过程:通过多次调用一趟插入排序实现 */ void ShellSort(RecordType r[],int n,int d[],int m)

/* 插入记录 */

208

少年易学老难成,一寸光阴不可轻 -

/* 对数组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].keyr[j+1]=r[j];

compare1++; /*记录比较次数* }

r[j+1]=r[0]; } } main() {

RecordType r[maxnum+1],bf[maxnum+1];

209

少年易学老难成,一寸光阴不可轻 -

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\

printf(\"\\n input the len of INC_serial(<10) :\");

scanf(\"%d\读入增量序列长度*/ printf(\"\\n input the searil :\");

for (i=0; i0) {

/*生成待排序的n个数据,注意保存初始数据*/ for (i=1; i<=n; i++)

{ r[i].key=bf[i].key=rand()%1000;

/* printf(\"%d \

}

/*对随机生成的数据进行希尔排序,显示所进行的关键字比较次数*/ compare=0; ShellSort(r,n,d,m);

210

少年易学老难成,一寸光阴不可轻 -

printf(\"\\nshell: compare=%.0f\ shell_com+=compare;

/*对随机生成的数据进行直接插入排序,所需关键字比较次数*/ compare1=0; Insertsort(bf,n);

printf(\"\Insert: compare=%.0f\ Ins_com+=compare1; times--; }

/*显示对times组数据排序的平均比较次数*/

printf(\"\\nShellsort comparing number=%.0f”,shell_com/m); printf(\"\\nInsertsort comparing number=%.0f\

}

211

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务