西北工业大学程序设计大作业.docx

上传人:b****5 文档编号:5939874 上传时间:2023-01-02 格式:DOCX 页数:18 大小:202.66KB
下载 相关 举报
西北工业大学程序设计大作业.docx_第1页
第1页 / 共18页
西北工业大学程序设计大作业.docx_第2页
第2页 / 共18页
西北工业大学程序设计大作业.docx_第3页
第3页 / 共18页
西北工业大学程序设计大作业.docx_第4页
第4页 / 共18页
西北工业大学程序设计大作业.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

西北工业大学程序设计大作业.docx

《西北工业大学程序设计大作业.docx》由会员分享,可在线阅读,更多相关《西北工业大学程序设计大作业.docx(18页珍藏版)》请在冰豆网上搜索。

西北工业大学程序设计大作业.docx

西北工业大学程序设计大作业

XXXX学院

XXXXXXXX

XXXXXXXX

XXX

1摘要3

1.1设计题目3

1.2设计内容3

1.3开发工具3

1.4应用平台3

2详细设计3

2.1程序结构3

2.2主要功能4

2.3函数实现5

2.4开发日志7

3程序调试及运行7

3.1程序运行结果7

3.2程序便用说明12

3.3程序开发总结12

4附件(源程序)12

1摘要

1.1设计题目

算法型大作业题目:

编写七种排序算法的演示程序。

1.2设计内容

编写快速排序、插入排序、选择排序、冒泡排序、堆排序、归并排序、基数排序函数,通过主函数调用以实现七种排序算法的演示。

1.3开发工具

VisualC++6.0

1.4应用平台

Windows2000/XP/Vista32位

2详细设计

2.1程序结构

程序的整体结构与流程见下图所示。

程序运行时在主菜单中输入序号选择排序方法或选择结束程序,当进行某种排序方法后,在主函数中输入待排数据个数和待排数据,通过调用对应的排序函数实现排序并输出。

该排序结束后再次进入主函数,通过循环重童上述操作。

其中,主函数中将数组地址和待排序数据个数传递给排序函数,在排序函数中实现排序功能。

2.2主要功能

函数的功能为对快速排序、插入排序、选择排序、冒泡排序、堆排序、归并排序、基数排序算法的演

Zj>0

主函数:

程序运行时,可使运行者根据提醒输入相关操作,从而进入不同的排序方法或者退出。

快速排序函数:

根据快速排序的算法,最后输出描入排序函数:

根据描入排序的算法,最后输出选择排序函数:

根据选择排序的算法,最后输出冒泡排序函数:

根据冒泡排序的算法,最后输出

堆排序函数:

根据堆排序的算法,最后输出归并排序函数:

根据归并排序的算法,最后输出基数排序函数:

根据基数排序的算法,皋后输出

2.3函数实现

在主函数中对菜单输出,通过switch语句中的case分支选择所需要的排序方法;通过while循环使演示程序在运行时能够持续进行

脱排序:

快速排序(kuaisu)又被称做分区交换排序,这是一种平均性能非常好的排序方法。

其算法基本思想是:

任取排序表中的某个数据元素(例如取第一个数据元素)作为基准,按照该数据元素的关键字大小,将整个排序表划分为左右两个于表:

左侧于表中所有数据元素的关键字都小干基准数据元素的关键字。

右侧于表中所有数据元素的关键字都大于或等于基准数据元素的关键字,基准数据元素则排在这两个子表中间(这也是该数据元素最终应安放的位直),然后分别对这两个于表重复施行上述方法的快速排序,直到所有的于表长度为1,则排序结束。

插入排序:

插入排序(charu)的基本思想:

开始时把第一个数据元素作为初始的有序序列,然后从第二个数据元素开始依次把数据元素按关键字大小描入到巳排序的部分排序表的适当位直。

当插入第i(l

如此进行n-1次描入,就完成了排序。

以下是在顺序表上实现的直接插入排序

在顺序表上进行直接插入排序时,当插入第i(l

选择排序

选择排序(xuanze)的算法基本思想是:

a)开始时设i的初始值为0。

b)如果i

c)若A[k]不是这组数据元素中的第一个数据元素(i=k),则将A[k]与A[i]这两数据元素的位直对调;小令1£+1转步骤b)o

胃泡排序:

冒泡排序(maopao)的基本思想是:

设排序表中有n个数据元素。

首先对排序表中第一,二个数据元素的关键字A[0]和A[l]进行比较。

如果前者大于后者,则进行交换;然后对第二,三个数据做同样的处理;重复此过程直到处理完最后两个相邻的数据元素。

我们称之为一趟胃泡,它将关键字最大的元素移到排序表的最后一个位置,其他数据元素一般也都向排序的最终位直移动。

然后进行第二趟排序,对排序表中前n-1个元素进行与上述同样的操作,其结果使整个排序表中关键字次大的数据元素被移到A[n-2]的位直。

如此最多做n-1趟冒泡就能把所有数据元素排好序。

堆排序:

堆排序(duipai)s

a.对排序表中的数据元素,利用堆的调整算法形成初始堆。

b.输出堆顶元素。

c.对剩余元素重新调整形成堆。

d.重宣执行第b、c步,直到所有数据元素被输出。

如果建立的堆满足最大堆的条件,则堆的第一个数据元素A[0]具有最大的关键字,将A[0]与A[n-1]对调,把具有最大关键字的数据元素交换到最后,再对前面的n-1个数据元素使用堆的调整算法,重新建立最大堆,结果把具有次最大关键字的数据元素又上浮到堆顶,即A[0]的位置,再对调A[0]和A[n-2],…,如此反童执行n-1次,最后得到全部排序好的数据元素序列。

归并排序:

其基本思想是:

设有两个有序表A和B,其数据元素个数(表长)分别为n和m,变量i和j分别是表A和表B的当前检测指针;设表C是归并后的新有序表,变量k是它的当前存放指针。

开始时i、j、k都分别指向A、B、C三个表的起始位置;然后根据A[i]与B[j]的关键字的大小,把关键字小的数据元素放到新表C[k]中;且相应的检测指针(i或j)和存放指针k增加1•如此循环,当i与j中有一个巳经超出表长时,将另一个表中的剩余部分照抄到新表C[k]~C[m+n]中。

下面的归并算法中,两个待归并的有序表首尾相接存放在数组sourcetable.arr[]中,其中第一个表的下标范围从left到mid,另一个表的下标范围从mid+1到righto前一个表中有mid-left+1个数据元素,后一个表中有right-mid个数据元素。

归并后得到的新有序表有riglit-mid个数据元素。

归并后得到的新有序表存放在另一个辅助数组mergedtable.air[]中,其下标范围从left到right。

一趟归并算法:

设数组sourcetable.arr[0]到sourcetable.arr[n-1]中的n个数据元素巳经分为一些长度为len的归并项,将这些归并项两两归并,归并成一些长度为21en的归并项,结果放到mergedtabie.arrf]中。

如果n不是21en的整数倍,则一趟归并到最后,可能遇到两种惜况:

剰下一个长度为len的归并项和一个长度不足len的归并项,可用一次merge算法,将它们归并成一个长度小于21en的归并项。

只剩下一个归并项,其长度小于或等干len,可将它直接負制到数组mergedtable.arrf]中。

在一趟归并算法的基础上,实现两路归并排序算法。

在两路归并排序算法中,初始排序表存放在数组table.arr[]中,第一趟归并将table.arr[冲的归并项两两归并,结果存放在辅助数组temptable.arr[]中。

第二趟将temptable.arrf]中的归并项两两归并,结果放回原数组table.arrf]中,如此反負进行。

为了将最后归并结果仍放在数组table.arr[]中,归并趟数应为偶数。

如果做奇数趟就能完成时,最后还需要执行一次一趟归并过程,由干这时的归并项长度len>=n,因此在则趟归并中whUe循环不执行,只做把temptable.arr[|中的数据元素复制到table.arr[]的工作。

基数排序:

“基数排序法”(radixsort)则是属于"分配式排序”(distributionsort),基数排序法又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属干稳定性的排序,其时间負杂度为O(nlog(r)m),其中r•为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。

具体可以参看后面的代码进行理解。

其它:

使用了stdlib头文件里包含的系统函数,包括清屏函数和运行时的暂停,增强了程序运行时的效果。

2.4开发日志

在老师布置了大作业的题目后,我就把题目下栽下来并进行分析巳选择合适的题目。

经过我的慎重考虑,选择了算法型大作业题目中的编写七种排序算法的演示程序,觉得自己有能力把这道题目很好完成。

在认真分析连题目后,基本确定了整体的思路,但是其中有堆排序,归并排序,基数排序我没有在教材中接触过,干是借助了图书馆和网络上的资源,重点对这三的函数进行编写。

在编写大作业过程中大的困难我没有遇到,只是有些小的疏忽常常导致程序无法运行,如形参和实参的不一致等。

我也在其中意识到对知识学握的不够熟练,在解决了这些问题后,我觉得自己对程序的编写更加熟练了,对问题的分析也更加严谨了。

在C程序设计的实验和理论考试之前代码巳基本完成。

在考试结束后,我又对程序稍微进行了修改,使之运行时效果更好。

接看开始写实验报告,整理自己的大作业。

我对我的作业是很满意的。

3程序调试及运行

3.1程序运行结果

1•进入程序运行后所显示的菜单:

2•快速排序:

 

・CKC

12345678

-

-safe

-返出雀斥

 

请谕入序F进‘厅选择:

押输入恃擀序数的个数:

备询入恃楼序数据:

^4792

第i逍:

24795

第2逍:

24795算丁逍:

24597笫4逍:

24579

*序结杲:

24579話按任惫龍继续・・・,

3

•插入排序:

博询入序号进行选择:

官输入待楼序数的个数:

幕输入恃拣序数据:

4631

笫畑4661

當2趙汐466

&3^:

3446

zi

”序结杲:

1346唁按任惫龍继续・・・■

4

•选择排序:

 

5•冒泡排序:

请询入序号进行选择:

春输入待擀序数的个数:

请输入待楼序数据:

第2逍:

271256第3趙:

122756

推序结杲訂22756

6•堆排序:

・CKC

请输入序号进行选择:

鲁输入林序数的个数:

请输入待楼序数据:

9«123H

第1趟,邙129S

第2趙注2309«

推序结杲:

1230?

8

请按任竜槌继续・・・■

12345678

退出程序

7•归并排序:

 

8•基数排序:

 

・CKC

堆序结果:

123

请按任惫龍继续・・・

12345678

请询入序^5■进代选择:

7

请询入待擀序数的个数:

请输入待楼序数据:

321

第i逍:

312

23

退出程序

 

 

9•结束:

 

 

诵谕入序号进行选择:

s

谢谢迹的使曲

Pae父父anykeytocontinue—

3.2程序使用说明

1•打开源程序,调试完毕后开始运行,开始进行七种算法的演示;

2•按照说明进行输入,选择数字1~7即可进入相应的排序算法演示程序,选择8结束程序;

3•选择排序的方法后,按要求输入待排数据的个数,然后输入待排序数据即可(数据排序结束后,矣自动清屏,进入菜单进行接下来的逸择);

4.应当注意,本演示程序对数据进行的是升序;

3.3程序开发总结

在选择这个题目时,我觉得难度系数10对我有挑战性,并且我对排序有相对比较熟悉,所以就选了这个题目。

但是在编写过程中却遇到很多问题。

我和我的同学进行了讨论,查阅了图书馆和网络上的资料,结合力我个人对本题目的理解对各种问题进行了处理,学到了很多教材上没有的知识。

从这次实践中,我意识到自己还有很多不足之处。

能力也得到了提高。

我在进行编程时还需要翻书査找,对于这一点,只能说对知识的学习还不够扎实,所以有空时还应该继续熟悉这门课程。

另外,就是对干错误的处理,不能得心应手,不能正确处理一些简单的错误。

对于逻辑上的错误,不能够立即找到出错点,往往需要向同学请教才能找出错误,并且改正。

我觉得这是自己独自思考能力不商的问题,遇事需要自己仔细想想,若还不能改正,再请教别人也不迟。

从总体上说,最终结果我很满意,我觉得我所设计的程序操作方便,功能良好。

我在上面花费了很多时间和精力,对作业不断进行修改和完善,我很有成就感。

我的能力在这之中得到了提商。

4附件(源程序)

#include

#include

////////////////////"""快速排序*—*//////////////////////

voidkuaisu(intA[],intn)

{

inti,j,k,t,p;

for(i=0;i

{

k=i;

for(j=i+l;j

if(A[j]

t=A[k];

A[k]=A[i];

A[i]=t;

printf(^%d趟二i+1);

for(p=0;p

{printf(H%dM,A[p));

}

printf(H\nH);

}

printf("\n排序结果

for(i=0;i

printf(H%dH,A[i]);

printf("\nH);

printf(n\nu);

system(npauseH);

system("CLSM);

}

////////////////////I****插入排序f"*//////////////////////voidcharu(intA[],intn)

{

inti,k,t,j,h=l;

for(i=l;i

{

t=A[i];

k=i-l;

while(t

{

A[k+l]=A[k];

k--;

if(k==-l)break;

printf("第%据:

”,h++);

for(j=0;j

printf("%d”,A[j]);

printf(H\nM);

A[k+l]=t;

}

printf("\n排序结果:

");for(i=0;i

printf(H%dM,A[i]);printf(,,\nH);

printf(,,\nH);

system(npauseH);

system("CLSM);

}

////////////////////I****选择排序f"*//////////////////////voidxuanze(intA[],intn)

{

inti,j,k,t,l,h=l;

for(i=0;i

{

k=i;

for(j=i+l;j

if(A[j]

if(i!

=k)

{

t=A[i];

A[i]=A[k];

A[k]=t;

printf("^%d趙二h++);

for(l=0;l

printf(M%dM,A[11);

printf(H\nM);

printf(H\n排序结果:

”);

for(i=0;i

printf(M%dM,A[i));

printf(n\nu);

printf(H\nn);

system("pauseH);

system(HCLSM);

}

////////////////////**********W泡排^*********7/////////////////////voidmaopao(intA[],intn)

{

inti,j,t,h=l,p;

for(j=0;j

for(i=0;i

{

if(A[i]>A[i+l])

t=A[i],A[i]=A[i+l],A[i+l]=t,p++;

printf(n^%d趟二h++);

for(p=0;p

}

printf("\n排序结果:

");for(i=0;i

printf(H\nM);

printf(H\nH);system(npause");system(nCLSM);

/////////////////////**********堆排序**********///////////////////////voidshift(intA[],inti,intm)

{

intk,t;

t=A[i];k=2*i+l;

while(k

{

if((k

}

A[i]=t;

}

voidduipai(intA[|、intn)//a为排序数组,n为数组大小

{

inti,k,h=l,j;

for(i=n/2-l;i>=0;i—)shift(A,i,n);

for(i=n-l;i>=l;i—)

{

k=A[O];A[O]=A[i];A[i]=k;

shift(A,O,i);

printfC第%01趟:

”,h++);

for(j=0;j

printf("%d”,A[j]);

printf(H\nM);

}

printf("\n排序结果:

");

for(i=0;i

printf(M%dM,A[i]);

printf(n\nu);

printf(H\nn);

system(npausen);

system(HCLSM);

}

////////////////////****归并排J^**********//////////////////////voidmerge(intnumber[],intfirst,intlast,intmid)

{

intnumber_temp[10]H0};

inti=first,j=mid+l,k;

for(k=0;k<=last-first;k++)

{

if(i==mid+l)

{

number_temp[k]=number[j++);

continue;

}

if(j==last+l)

{

number_temp[k]=number[i++];

continue;

}

if(number[i]

elsenumber_temp[k]=number[j++];

}

for(i=first,j=O;i<=last;i++J++)

number[i]=number_temp[j];

}

voidmerge_sort(intnumber[],intfirst,intlast)

{

intmicl=O;

if(first

{

mid=(first+last)/2;

merge_sort(number,first,mid);

merge_sort(number,micl+1,last);

merge(number,firstJast,mid);

}

voidguibingfinta[],intn)inti;merge_sort(a,0,n-l);printf("\n排序结果:

");for(i=0;i

system(npause");system(nCLSM);

////////////////////^^^^基数排序^^"^7/////////////////////voidjishu(intclata[],intn)

{

inttemp[10][10]=^0r;

intorder[10]={0};

inti,j,k,q,lsd;

k=0;

q=l;

while(q<=n)

{

for(i=0;i

{

lsd=((data[i]/q)%n);

temp[lsd][order[lsd]]=data[i];

order[lsd|++;

}

for(i=0;i

{

if(order[i]!

=0)

for(j=0;j

{

data|k]=temp[i][j];

k++;

}

order[i]=0;

q*=n;

k=0;

printf(M\n排序结果:

”);

for(i=0;i

printf(n%dH,clata[i]);

printf(H\nH);

printf(H\nH);

system("pauseH);system(MCLSM);

}

////////////////////***********主函数***********//////////////////////intmain()

{

intA[100],p,n,i;

while(l)

printf(H\n\t****************

七种排序算法的演示程序

***************\)・

printf(H\t*

*\n");

printf(H\t*

1—

快速排序

*\n");

printf(H\t*

2—

…描入排序

*\n");

printf(H\t*

3—

一选择排序

*\n");

printf(H\t*

4…

冒泡排序

*\n");

printf(M\t*

5—

•—堆排序

*\nu);

printf(H\t*

6—

归并排序

*\n");

printf(H\t*

7—

一基数排序

*\n");

printf(M\t*

8—

退出程序

*\n");

printf(M\t*

*\n1;

printf(H\t*

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

\n\iT);

printfr请输入序号进行选择:

\n”);

scanf(M%dM,&p);if(p==8)break;

printf(储输入待排序数的个数:

\n“);scanf(”%d役&n);

printff"请输入待排序数据:

\rT);

for(i=0;i

scanf(”%cT,&A[i]);

switch(p)

{

case1:

kiiaisu(A,n);brea

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

当前位置:首页 > 医药卫生 > 基础医学

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

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