排序综合课程设计.docx

上传人:b****8 文档编号:29321949 上传时间:2023-07-22 格式:DOCX 页数:74 大小:453.67KB
下载 相关 举报
排序综合课程设计.docx_第1页
第1页 / 共74页
排序综合课程设计.docx_第2页
第2页 / 共74页
排序综合课程设计.docx_第3页
第3页 / 共74页
排序综合课程设计.docx_第4页
第4页 / 共74页
排序综合课程设计.docx_第5页
第5页 / 共74页
点击查看更多>>
下载资源
资源描述

排序综合课程设计.docx

《排序综合课程设计.docx》由会员分享,可在线阅读,更多相关《排序综合课程设计.docx(74页珍藏版)》请在冰豆网上搜索。

排序综合课程设计.docx

排序综合课程设计

.

 

大连科技学院

 

数据结构课程设计

 

题目排序综合

 

学生专业班级

 

指导教师职称副教授

 

所在单位信息科学系软件教研室

 

教学部主任

 

完成日期2013年1月11日

 

.

.

 

课程设计报告单

 

学号专业班级网络工程11-1

 

考核项目评分备注

平时工作态度及遵守纪律情况

1

(10分)

掌握基本理论、关键知识、基本技能的程度和

2阅读参考资料的水平

(10分)

独立工作能力、综合运用所学知识分析和解决

3问题能力及实际工作能力提高的程度

(20分)

完成课程设计说明书及软件的情况与水平(小组分工情况、规性、整洁清楚、叙述完整性、

4思路清晰程度、工作量及实际运行情况和创新性)

(60分)

 

总评成绩

 

综合评定:

(优、良、中、及格、不及格)

 

.

.

 

指导教师签字:

2013年1月11日

数据结构课程设计任务书

 

一、任务及要求:

1.设计(研究)任务和要求研究容:

排序综合

任务和要求:

(1)学习数据结构基础知识,掌握数据结构典型的算法的使用。

(2)对指导教师下达的题目进行系统分析。

(3)根据分析结果完成系统设计。

(4)编程:

在计算机上实现题目的代码实现。

(5)完成对该系统的测试和调试。

(6)提交课程设计报告。

要求完成课程设计报告3000字以上(约二十页)。

完成若干综合性程序设计题目,综合设计题目的语句行数的和在100行语句以上。

2.原始依据

结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3.参考题目:

 

二、工作量

2周(10个工作日)时间

 

三、计划安排

第1个工作日:

查找相关资料、书籍,阅读示例文档,选择题目。

第2个工作日-第3个工作日:

设计程序结构、模块图。

第4个工作日-第9个工作日:

完成程序的编码,并且自己调试、测试。

穿插进行课程设计报告的撰写。

第10个工作日:

上交课程设计报告,由教师检查软件测试效果、检查课程设计报告,给出学生成绩。

 

指导教师签字:

2012年12月24日

 

.

.

 

排序综合1

1.需求分析1

1.1任务描述1

1.2功能分析1

2.概要设计1

2.1主要全程变量和数据结构1

2.2程序模块结构2

3.详细设计3

3.1程序的主要结构如下图所示。

3

3.3显示各排序算法排序后的的数据。

4

3.4函数实现(例如直接插入排序)4

4.调试分析5

5.测试结果及运行效果7

参考文献11

附录全部代码12

数据结构课程设计总结24

 

.

.

 

排序综合

1.需求分析

 

1.1任务描述

 

至少采用3种方法实现上述问题求解,并把排序后的结果保存在不同的文件中。

 

1.2功能分析

 

显示随机数,是调用rand()函数输出数组a[]。

数组a[]中保存有随机产生的随机数;直接选择排序,是通过n-1次关键字之间的比较,从n-i+1个记录中选出关键字最小的记

录,并和第i个记录交换之;起泡排序,是如果有n个数,则要进行n-1趟比较,在将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个排序中的记录“基本有序”时,在对全体记录进行一次直接插入排序;直接插入排序,是将一个记录插入到以排序好的有序表中,从而得到一个新的记录数增1的有序表。

设整个排序有n个

数,则进行n-1趟排序,即:

先将序列中的第一个记录看成一个有序的子序列,然后第

2个记录起逐个进行插入,直接整个序列变成按关键字非递减有序列为止;快速排序,

是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排

序过程可以递归进行,以此达到整个数据变成有序序列;堆排序,主要由建立初始堆

和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。

 

2.概要设计

 

2.1主要全程变量和数据结构

 

(1)数据结构:

#include"stdlib.h"

#include

#defines100

typedefstructrecord

{intkey;};

staticstructrecorda1[s],a2[s],a3[s],a4[s],a5[s],a6[s],rec;inta[7],b[7];file()

 

.

.

 

(2)算法的入口及其说明

#include

#defines100

//宏定义命令

typedefstructrecord

//记录声明的结构体

{intkey;};//定义变量

static

structrecorda1[s],a2[s],a3[s],a4[s],a5[s],a6[s],rec;

inta[7],b[7];//记录静态变量结构体

file()

//系统定义

{

printf("

*********************************

\n");

printf("

***

*1.

直接插入排序

***

\n");

printf("

***

*2.

希尔排序

***

\n");

printf("

***

*3.

起泡排序

***

\n");

printf("

***

*4.

快速排序

***

\n");

printf("

***

*5.

简单选择排序

***

\n");

printf("

***

*6.

堆排序

***

\n");

printf("

***

*7.

总结

***

\n");

printf("****0.退出***\n");

printf("*********************************\n");}

以上printf("*********************************\n");为系统主菜单

输出

 

2.2程序模块结构

程序划分为以下几个模块(即实现程序功能所需的函数)

主控菜单项选择函数:

menu_select()

插入排序函数:

InsertSort()

选择排序函数:

StlectSort()

起泡排序函数:

BubbleSort()

堆排序函数:

heapsort()

快速排序函数:

Quicksort()

希尔排序:

ShellSort()

 

.

.

 

3.详细设计

3.1程序的主要结构如下图所示。

 

图3-1函数调用关系图

 

其中main()是主函数,它进行菜单驱动,根据选择项1~0调用相应的函数

 

3.2数据结构定义

 

图3-2课程设计流程图

 

.

.

 

3.3显示各排序算法排序后的的数据。

 

图3-3程序工作流程图

 

3.4函数实现(例如直接插入排序)

#include"stdlib.h"

#include

#defines100

typedefstructrecord

{intkey;};

staticstructrecorda1[s],a2[s],a3[s],a4[s],a5[s],a6[s],rec;

inta[7],b[7];

file()

{

printf("*********************************\n");

printf("****1.直接插入排序***\n");

printf("****0.退出***\n");

printf("*********************************\n");}

voidStraight_insert_sort(r,n)/*直接插入*/

structrecordr[];

intn;

{inti,j;a[1]=0;b[1]=0;

.

.

 

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

printf("%4d",r[i].key);

printf("\n");

for(i=2;i<=n;i++)

{r[0]=r[i];j=i-1;

while((j>=0)&&(r[0].key

r[j+1]=r[j--];

r[j+1]=r[0];

a[1]=a[1]+2;

}

}

printf("************直接插入******************\n");

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

printf("%4d",r[i]);

printf("\n");

printf("move:

%dtime,compete:

%dtime",a[1],b[1]);printf("\n");

}

4.调试分析

 

4.1直接插入排序

将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表

 

4.2起泡排序

首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个

记录交换,然后比较第二个记录和第三个记录的关键字。

依此类推,知道第N-1个和第

N个记录的关键字进行过比较为止。

上述为第一趟排序。

其结果使得关键字的最大被安

排到最后一个记录的位置上。

然后进行第二趟起泡排序,对前N-1个记录进行同样操作。

一共要进行N-1趟起泡排序。

 

4.3直接选择排序

每一趟从待排序的记录中选出关键字最小的,顺序放在以排好序的子文件的最后,

知道全部记录排序完毕。

 

.

.

 

4.4希尔排序

先取一个小于n的整数d,作为第一个增量,把文件全部记录全部分成d1个组。

所有距离为d1的倍数的记录放在同一个组中。

先在个组中进行直接插入排序:

然后,

取第二个增量d2

 

4.5快速排序

设置两个变量i、j,排序开始的时候:

i=0,j=N-1;以第一个数组元素作为

关键数据,赋值给key,即key=A[0];从j开始向前搜索,即由后开始向前搜索(j

--),找到第一个小于key的值A[j],A[i]与A[j]交换;从i开始向后搜索,即由前

开始向后搜索(i++),找到第一个大于key的A[i],A[i]与A[j]交换;重复第3、4、5步,直到I=J;(3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。

找到并交换的时候i,j指针位置不变。

另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。

 

4.6堆排序

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它

们均是通过调用Heapify实现的。

堆排序的最坏时间复杂度为O(nlogn)。

堆序的平均性能较接近于最坏性能。

由于建初始堆所需的比较次数较多,所以堆排序不适

宜于记录数较少的文件。

堆排序是就地排序,辅助空间为O

(1)。

 

排序算法

时间复杂度

空间复杂度

是否稳定

直接插入排序

O(n2)

O

(1)

稳定

起泡排序

O(n2)

O

(1)

稳定

直接选择排序

O(n2)

O

(1)

不稳定

希尔排序

O(n1.5)

O

(1)

不稳定

快速排序

O(nlog2

n)

O(nlog2

n)

不稳定

堆排序

O(nlog2

n

O(l)

不稳定

 

图4-1时间复杂度分析

 

.

.

 

5.测试结果及运行效果

(1)运行程序进入程序开始菜单

 

图5-1开始菜单

 

(2)开始菜单中会出现四个选项:

①完全有序的情况;②逆序的情况;③随机排序的

情况;④退出。

运行时选择了③随机排序的情况,得到100个随机数的随机排序,如下图。

 

图5-2随机排序

 

(3)得出随机数字后,程序列出七个选项:

①冒泡排序;②直接插入排序;③简单选

择排序;④快速排序;⑤希尔排序;⑥堆排序;⑦退出。

选择①冒泡排序,对

100个随

机数进行冒泡排序,得到结果如下图。

 

.

.

 

图5-3起泡排序

 

(4)为了测试该程序,下面继续尝试进行了其他几种排序方式,结果如下图所示。

 

图5-4直接插入排序

 

.

.

 

图5-5简单选择排序简单选择排序结果如上图

 

图5-6快速排序快速排序结果如上图

 

.

.

 

图5-7希尔排序希尔排序结果如上图

 

图5-8堆排序堆排序结果如上图

 

以上图片为各种排序的结果,排序结果后显示出各种方式排序所用移动次数和比较次数,以方便比较使用。

 

.

.

 

参考文献

 

[1]严蔚敏吴伟民著.《数据结构(C语言版).清华大学出版.1999年第一版

[2]一华等编.数据结构---使用C语言.电子科技大学.1998年第一版

[3]谭浩强.C语言程序设计(第二版)..高等教育.2002

 

.

.

 

附录全部代码

#include"stdlib.h"

#include

#defines100

typedefstructrecord

{intkey;};

staticstructrecorda1[s],a2[s],a3[s],a4[s],a5[s],a6[s],rec;

inta[7],b[7];

file()

{

printf("

*********************************

\n");

printf("

***

*1.

直接插入排序

***

\n");

printf("

***

*2.

希尔排序

***

\n");

printf("

***

*3.

冒泡排序

***

\n");

printf("

***

*4.

快速排序

***

\n");

printf("

***

*5.

简单选择排序

***

\n");

printf("

***

*6.

堆排序

***

\n");

printf("

***

*7.

总结

***

\n");

printf("

***

*0.退出

***\n");

printf("

*********************************

\n");

}

 

voidStraight_insert_sort(r,n)/*直接插入*/

structrecordr[];

intn;

{inti,j;a[1]=0;b[1]=0;for(i=1;i<=n;i++)

printf("%4d",r[i].key);

printf("\n");

for(i=2;i<=n;i++)

{r[0]=r[i];j=i-1;

while((j>=0)&&(r[0].key

 

.

.

 

{b[1]++;

r[j+1]=r[j--];r[j+1]=r[0];a[1]=a[1]+2;

}

}

printf("************直接插入******************\n");

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

printf("%4d",r[i]);

printf("\n");

printf("move:

%dtime,compete:

%dtime",a[1],b[1]);printf("\n");

}

 

voidShell_sort(r,n)/*希尔排序*/

structrecordr[];

intn;

{structrecordrec,temp;inti,j,t,h;

a[2]=0;b[2]=0;

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

printf("%4d",r[i].key);

printf("\n");

t=n/2;

while(t>=1)

{h=t;for(j=h;j

{rec=r[j];

i=j-h;

while((i>=0)&&(r[i].key>rec.key))

{b[3]++;

temp=r[i+h];

r[i+h]=r[i];

r[i]=temp;

 

.

.

 

i=i-h;

a[2]=a[2]+3;

}

}

t=t/2;

b[2]++;

 

}

printf("************************希尔排序**************************\n");

for(i=0;i

printf("%4d",r[i]);

printf("\n");

printf("move:

%dtime,compete:

%dtime",a[3],b[3]);printf("\n");

}

 

voidBubblle_sort(r,n)/*冒泡排序*/

structrecordr[];

intn;

{structrecordrec;

inti,j,m,flag;

a[3]=0;b[3]=0;

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

printf("%4d",r[i].key);

printf("\n");

m=n;

flag=1;

for(i=1;i<=m-1;i++)

{flag=0;

for(j=0;j<=m-i-1;j++)

if(r[j].key>r[j+1].key)

{b[3]++;

rec.key=r[j].key;

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

r[j+1].key=rec.key;

 

.

.

 

a[3]=a[3]+3;

flag=1;

}

if(flag==0)break;

}

printf("*************冒泡排序****************\n");

for(i=0;i

printf("%4d",r[i].key);

printf("\n");

printf("move:

%dtime,compete:

%dtime",a[3],b[3]);printf("\n");

 

}

 

intpush(h,top,m,n)

inth[];

inttop,m,n;

{h[++top]=m;h[++top]=n;return(top);

}

 

intpop(h,top,m,n)

inth[],top,*m,*n;

{*m=h[top--];*n=h[top--];return(top);

}

 

intquick(r,i,j)

structrecordr[];

inti,j;

{

rec=r[i];

while(i

{while((irec.key))

 

.

.

 

j--;

b[4]++;

if(i

r[i++]=r[j];

a[4]++;

while((i

i++;

b[4]++;

if(i

r[j--]=r[i];

a[4]++;

}

r[i]=rec;

a[4]++;

return(i);

}

voidQuick_sort(r,l,h)/*快速排序*/

structrecordr[];

intl,h;

{intss[s];inttop,i,j,k;

for(i=1;i<=s;i++)

printf("%4d",r[i].key);

printf("\n");

i=l;

j=h;

top=-1;

do

{while(i

if(j-k>1)top=push(ss,top,k+1,j);

j=k-1;

}

if(top>0)

 

.

.

 

top=pop(ss,top,&j,&i);

}

while((top>=0)||(i

printf("**************************快速排序*************************\n");

for(i=1;i<=s;i++)

printf("%4d",r[i].key);

printf("\n");

printf("move:

%dtime,compete:

%dtime",a[4],b[4]);

}

 

voidSimple_select_sort(r,n)/*简单选择排序*/

structrecordr[];

intn;

{

inti,j,m;

a[5]=0;b[5]=0;

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

printf("%4d",r[i].key);

printf("\n");

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

{m=i;for(j=i+1;j<=n;j++)if(r[j].key

m=j;

b[5]++;

if(i!

=m)

{rec=r[i];r[i]=r[m];r[m]=rec;

a[5]=a[5]+3;

}

}

printf("************************简单选择************************\n");

for(i=1;i<=s;i++)

printf("%4d",r[i].ke

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1