七种排序算法的比较及每种排序的上机统计时间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 */