武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx

上传人:b****8 文档编号:27919834 上传时间:2023-07-06 格式:DOCX 页数:23 大小:127.67KB
下载 相关 举报
武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx_第1页
第1页 / 共23页
武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx_第2页
第2页 / 共23页
武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx_第3页
第3页 / 共23页
武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx_第4页
第4页 / 共23页
武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx

《武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx》由会员分享,可在线阅读,更多相关《武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx(23页珍藏版)》请在冰豆网上搜索。

武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸.docx

武汉理工大学《数据结构》课程论文中国好学长系列之小灰灰的爸爸

附件1:

学号:

课程设计

 

题目

交换排序的设计与实现

学院

计算机科学与技术学院

专业

软件工程专业

班级

中国好学长系列

姓名

小灰灰的爸爸

指导教师

夏红霞

 

2013

25

课程设计任务书

学生姓名:

专业班级:

指导教师:

夏红霞工作单位:

计算机科学与技术学院

题目:

交换排序的设计与实现

初始条件:

理论:

学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;

实践:

软件工程系实验室提供计算机及软件开发环境。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1、系统应具备的功能:

(1)随机产生1000个整数

(2)实现冒泡排序、双向冒泡排序和快速排序

(3)比较各种交换排序的优劣

2、数据结构设计;

3、主要算法设计;

4、编程及上机实现;

5、撰写课程设计报告,包括:

(1)设计题目;

(2)摘要和关键字(中文和英文);

(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等;

(4)结束语;

(5)参考文献。

时间安排:

2013年元月21日-25日(第21周)

元月21日查阅资料

元月22日系统设计,数据结构设计,算法设计

元月23日-24日编程并上机调试,验收程序

元月25日撰写报告、提交报告

 

指导教师签名:

2013年元月21日

系主任(或责任教师)签名:

2013年元月21日

交换排序的设计与实现

摘要:

设计一个程序,要求能够产生1000个随机数,分别用冒泡排序、双向冒泡排序和快速排序三种方法对它们进行排序并比较各种交换排序法的优劣。

关键字:

随机数 交换排序 数据结构算法

abstract:

Designaprogram,cangenerate1000randomnumbers,respectivelyusingbubblesort,bidirectionalbubblesortandquicksortofthreemethodstosortthemoutandcomparedtheprosandconsofvariousexchangesort.

Keywords:

Randomnumbers Exchangesort DatastructureAlgorithm

1引言

1.1冒泡排序法

首先将第一个关键字和第二个关键字进行比较,若为逆序,则将两关键字交换,然后比较第二个和第三个关键字,依此类推,直至第n-1个和第n个关键字相比较,结果使最大的关键字被安置到最后一个位置上,此为一趟起泡排序。

然后开始第二趟起泡排序,其结果是将次大的关键字被安置到第n-1个位置上,以此类推,直至序列有序。

1.2双向冒泡排序法

双向冒泡排序法是在冒泡排序法的基础上改进的,首先它在将最大关键字安置在最后一个位置上后也将最小关键字安置在第一个位置,然后开始第二趟起泡排序,以此类推直至序列有序,由于它让序列的两个方向同时进行排序,故称双向冒泡排序。

1.3快速排序法

快速排序法是一种效率很高的排序方法,适用于排序问题的规模很大但对于稳定性不作要求的情况。

它的设计方法是分治法,基本思想是:

在待排序列中选择一个对象作为枢轴,然后进行一趟快速排序,将序列分割为两个子序列,一个子序列的所有对象都不大于枢轴,一个都不小于枢轴。

然后便对这两序列重复上面的操作,依此类推,直至所有对象都被确定了位置,即序列有序。

2需求分析

本系统应具有三个功能:

产生随机整数,对关键字进行排序和记录排序所比较和调换的次数。

2.1产生随机数产生随机数

系统要求产生1000个整数,故采用随机函数rand来实现,在主函数头文件中包含time.h和stdlib.h。

系统中采用srand函数来对随机函数rand进行初始化,产生的随机数用一维数组来存储。

2.2对关键字排序

用冒泡排序法、双向冒泡排序法和快速排序法分别对关键字排序

2.3比较三种交换排序的优劣

本实验要求比较三种交换排序的优劣,其主要评判标准是时间复杂度。

《数据结构》中理论的分析了它们排序所用时间,而此实验用具体数据论证。

3数据结构设计

3.1流程图

3.2算法设计

3.2.1产生1000个随机数

srand(time(NULL));//随机产生1000个1000以内的正整数

printf("随机产生1000个整数\n");

for(inti=0;i<1000;i++)

{

a[i]=rand()%1000;//保证产生的整数在1000内,并存于数组a[]

printf("%d",a[i]);

}

for(m=0;m<1000;m++)

{

b[m]=a[m];//将数组a[]复制到数组b[],c[]

c[m]=a[m];

}

3.2.2冒泡排序

对于n个关键字的起泡排序,共要进行n-1趟的排序,第i趟要对n-i+1个关键字进行排序,即key[0]到key[n-i],可知共有两层循环。

在每一次的排序中,都定义一个临时变量temp,用以作为关键字交换时的临时存储单元。

Voidbubble_sort(intarray[])//冒泡排序法排列1000个数并记录比较和调换次数

{

inttemp,i,j;

intm=0,p=0;

for(j=0;j<999;j++)

for(i=0;i<999-j;i++)

{

if(array[i]>array[i+1])

{

temp=array[i];

array[i]=array[i+1];

array[i+1]=temp;

++m;

}

++p;

}

printf("冒泡排序结果:

\n");

for(j=0;j<1000;j++)

{

printf("%d",array[j]);

}

printf("\n");

3.2.3记录冒泡排序法的对调次数与比较次数

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

printf("\n\n\t\t冒泡排序的对调次数:

%d\n\n",m);

printf("\t\t冒泡排序的比较次数:

%d\n\n",p);

}

3.2.4双向冒泡排序

对于n个关键字的冒泡排序,共要进行n-1趟的排序,第i趟要对n-i+1个关键字进行排序,即key[0]到key[n-i],且每次正向排序后马上反向排序,可知共有两层循环。

在每一次的排序中,都定义一个临时变量t,用以作为关键字交换时的临时存储单元。

voidmaopao(intsource[],intn)//双向冒泡排序法排列1000个数并记录比较和调换次数

{

intstart=0,end=n-1;

inti,k=0,l=0;

while(start<=end)/*如果还有元素没有确定其位置*/

{

for(i=start;i

{

if(source[i]>source[i+1])

{

intt;

t=source[i];

source[i]=source[i+1];

source[i+1]=t;

++k;

}

++l;

}

end--;/*找到最大数*/

for(i=end;i>start;i--)/*寻找剩余元素的最小元素*/

{

if(source[i]

{

intt;

t=source[i];

source[i]=source[i-1];

source[i-1]=t;

++k;

}

++l;

}

start++;/*找到一个最小数*/

}

printf("双向冒泡排序结果:

\n");

for(intj=0;j<1000;j++)

{

printf("%d",source[j]);

}

printf("\n");

3.2.5记录双向冒泡排序法的对调次数与比较次数

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

printf("\n\n\t\t双向冒泡排序的对调次数:

%d\n\n",k);

printf("\t\t双向冒泡排序的比较次数:

%d\n\n",l);

}

3.2.6快速排序

快速排序中需要选取一个枢轴,枢轴不需要随着关键字移动,故可将它暂寄在temp,还需要定义两个指针l和r。

排序分两个函数实现,一个是递归形式的快速排序,另一个是一趟快速排序。

在对由枢轴分割的子序列进行排序时,依赖于前者对后者的调用来实现,后者完成具体的排序过程。

voidq_sort(intR[],intl,intr,int&a,int&b)//快速排序法排列1000个数并记录比较和调换次数

{

inttemp;

inti=l,j=r;

if(l

{temp=R[l];

while(i!

=j)

{

while(j>i&&R[j]>temp)--j;

if(i

{R[i]=R[j];

++i;

++a;

}++b;

while(i

if(i

{

R[j]=R[i];

--j;

++a;

}++b;

}

R[i]=temp;

q_sort(R,l,i-1,a,b);

q_sort(R,i+1,r,a,b);

}

printf("快速排序结果:

\n");

for(intj=0;j<1000;j++)

{

printf("%d",c[j]);

}

printf("\n");

3.2.7记录快速排序法的对调次数与比较次数

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

printf("\n\n\t\t快速排序的对调次数:

%d\n\n",change);

printf("\t\t快速排序的比较次数:

%d\n\n",compare);

}

4程序实现及测试

4.1源代码

#include

#include

#include

voidbubble_sort(intarray[])

{

inttemp,i,j;

intm=0,p=0;

for(j=0;j<999;j++)

for(i=0;i<999-j;i++)

{

if(array[i]>array[i+1])

{

temp=array[i];

array[i]=array[i+1];

array[i+1]=temp;

++m;

}

++p;

}

printf("冒泡排序结果:

\n");

for(j=0;j<1000;j++)

{

printf("%d",array[j]);

}

printf("\n");

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

printf("\n\n\t\t冒泡排序的对调次数:

%d\n\n",m);

printf("\t\t冒泡排序的比较次数:

%d\n\n",p);

}

voidmaopao(intsource[],intn)

{

intstart=0,end=n-1;

inti,k=0,l=0;

while(start<=end)/*如果还有元素没有确定其位置*/

{

for(i=start;i

{

if(source[i]>source[i+1])

{

intt;

t=source[i];

source[i]=source[i+1];

source[i+1]=t;

++k;

}

++l;

}

end--;/*找到最大数*/

for(i=end;i>start;i--)/*寻找剩余元素的最小元素*/

{

if(source[i]

{

intt;

t=source[i];

source[i]=source[i-1];

source[i-1]=t;

++k;

}

++l;

}

start++;/*找到一个最小数*/

}

printf("双向冒泡排序结果:

\n");

for(intj=0;j<1000;j++)

{

printf("%d",source[j]);

}

printf("\n");

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

printf("\n\n\t\t双向冒泡排序的对调次数:

%d\n\n",k);

printf("\t\t双向冒泡排序的比较次数:

%d\n\n",l);

}

voidq_sort(intR[],intl,intr,int&a,int&b)

{

inttemp;

inti=l,j=r;

if(l

{temp=R[l];

while(i!

=j)

{

while(j>i&&R[j]>temp)--j;

if(i

{R[i]=R[j];

++i;

++a;

}++b;

while(i

if(i

{

R[j]=R[i];

--j;

++a;

}++b;

}

R[i]=temp;

q_sort(R,l,i-1,a,b);

q_sort(R,i+1,r,a,b);

}

 

}

intmain(void)

{

inta[1000],b[1000],c[1000];

intchange=0,compare=0;

intm;

srand(time(NULL));

printf("随机产生1000个整数\n");

for(inti=0;i<1000;i++)

{

a[i]=rand()%1000;

printf("%d",a[i]);

}

for(m=0;m<1000;m++)

{

b[m]=a[m];

c[m]=a[m];

}

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

bubble_sort(a);

maopao(b,1000);

q_sort(c,0,999,change,compare);

printf("快速排序结果:

\n");

for(intj=0;j<1000;j++)

{

printf("%d",c[j]);

}

printf("\n");

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

printf("\n\n\t\t快速排序的对调次数:

%d\n\n",change);

printf("\t\t快速排序的比较次数:

%d\n\n",compare);

return0;

}

4.2运行结果

产生1000个随机数

冒泡排序的结果

冒泡排序的理论比较次数为n(n-1)/2=1000*(1000-1)/2=499500

这与运行得出的实际值相符合

 

双向冒泡排序的理论比较次数为n(n-1)/2=1000*(1000-1)/2=499500

这与运行得出的实际值相符合

 

快速排序法的理论比较次数为n(log

(2)n)/2=1000*log

(2)1000/2=4985

这与实际运行得出的值相近

 

比较三种排序方法可知,冒泡排序和双向冒泡排序的调换次数和比较次数是一样的,而快速排序法则明显优于其他两种交换排序方法,其效率约为前两者的100倍。

本程序由于所要排序的数较多,要用到随机函数,产生足够多的随机数;要比较两种交换排序的优劣,则要记录各种排序法所比较和调换的次数以便比较。

5设计体会

这个程序的设计看似简单,但实际操作起来却很麻烦,编出的程序常常无法运行,且很难找出错误,修改了很多次才能正常运行,由于这次的课程设计,我更加体会到了要将理论运用于实践是有难度的,以后要多多上机编写程序而不能总是理论上明白就行。

参考文献:

[1]《数据结构高分笔记》率辉机械工业出版社2013版

[2]《数据结构(c语言版)》严蔚敏吴伟民清华大学出版社2008版

[3]《c++程序设计》谭浩强清华大学出版社2004版

本科生课程设计成绩评定表

班级:

 姓名:

  学号:

序号

评分项目

满分

实得分

1

学习态度认真、遵守纪律

10

2

设计分析合理性

10

3

设计方案正确性、可行性、创造性

20

4

设计结果正确性

40

5

设计报告的规范性

10

6

设计验收

10

总得分/等级

评语:

注:

最终成绩以五级分制记。

优(90-100分)、良(80-89分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

 

                 指导教师签名:

                  2013年元月25日

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

当前位置:首页 > 高中教育 > 数学

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

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