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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档