七种排序算法的比较及每种排序的上机统计时间

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告

课题: 排序算法的比较

学院:信息学院

班级: 2011级电子信息工程1班

小组成员:韦志东(组长)

夏琪

完成时间: 2014-01-08

教师:周铁

目录

、设计任务书 (2)

27

27

1、课程分析

、选题要求

利用随机函数产生30000个随机整数,利用直接插入排序、希尔排序,冒泡排序、直接选择排序、快速排序、堆排序、归并排序的排序方法进行排序,并统计每一种排序上机所花费的时间。

、选题的意义及背景

排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键词有序的序列。

此实验通过对各种内部排序算法进行比较,能使我们更好的掌握各种排序的基本思想,掌握各种排序方法的算法实现,掌握各种排序方法的优劣分析及花费的时间的计算,掌握各种排序方法所适应的不同场合。通过该题目的设计,可以加深理解各种数据结构的逻辑结构、存储结构及相应上运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养我们的动手能力。

、设计任务书

(1)定义结构体,头文件,定义数组范围,大小。

(2)依次描写七种排序的算法。

(3)描写产生随机函数的算法。

(4)描写菜单函数。

(5)描写主函数,调用七种排序的算法。

2、设计分析

原始资料

用户输入记录的个数30000个,数据由随机函数生成。

输出数据

产生的随机数分别用冒泡排序、直插排序、希尔排序、选择排序、快速排序、堆排序、归并排序这些排序方法进行排序,并统计每一种排序上机所花费的时间。程序流程图

#include ""

#include ""

#include<>

#include<>

#define MAX 60000 /*记录数组的个数*/

#define NUM 30000 /*实际输入数组的个数*/

typedef int datatype;

typedef struct /*定义记录为结构体类型*/

{ int key; /*记录的关键词域*/

datatype other; /*记录的其它域*/

} rectype;

rectype *s1,s[MAX];/*s[MAX]存放原始随机数,*s1取出原始数据后进行排序*/ /*直接插入排序算法如下*/

void insert_sort(rectype *r) /*对数组r按递增顺序进行插入排序算法*/

{ int i,j,n=NUM; /*NUM为实际输入的记录数,是一个常量*/

for(i=1;i<=n;i++) /* i

j=i-1; /*依次插入记录r[1],……,r[NUM]*/

while(r[0].key

{r[j+1]=r[j--];} /*将记录关键词大于r[i].key的记录后移*/ r[j+1]=r[0]; /*将记录r[i]插入到有序表的合适的位置上*/ }

}/*INSERTSORT*/

/*希尔排序算法如下*/

void shell_sort(rectype *r) /*取增量为d(i+1)=[d(i)/2]的希尔排序的算法*/ { int i,n,jump,change,temp,m; /*change为交换标志,jump为增量步长*/

jump=NUM; n=NUM; /*NUM为顺序表的实际长度*/

while(jump>0)

{ jump=jump/2; /*取步长d(i+1)=[d(i)/2]*/

do { change=0; /*设置交换标志,change=0表示未交换*/

for(i=1;i<=n-jump;i++)

{ m=i+jump; /*取本趟的增量*/

if(r[i].key>r[m].key) /*记录交换*/

{ temp=r[m].key;

r[m].key=r[i].key;

r[i].key=temp;

change=1; /*change=1表示有交换*/

}/*if*/

}/*for*/ /*本趟排序完成*/

}while(change==1); /*当change=0时终止本趟排序*/

}/*while*/ /*当增量jump=1且change=0时终止算法*/

}/*SHELLSORT*/

/*冒泡排序算法如下*/

void bubble_sort(rectype *r) /*从下往上扫描的冒泡排序*/

{ int i,j,noswap=0,n=NUM; /*noswap为交换标志,NUM为实际输入记录数*/ rectype temp;

for(i=1;i

{ noswap=1; /*设置交换标志,noswap=1表示没有记录交换*/ for(j=n;j>=i;j--) /*从下往上扫描*/

if(r[j].key

{ =r[j-1].key;

r[j-1].key=r[j].key;

r[j].key=;

noswap=0; /*当交换记录时,将交换标志置0即noswap=0 */

相关文档
最新文档