排序算法性能分析说明书.docx

上传人:b****4 文档编号:24807056 上传时间:2023-06-01 格式:DOCX 页数:22 大小:85.62KB
下载 相关 举报
排序算法性能分析说明书.docx_第1页
第1页 / 共22页
排序算法性能分析说明书.docx_第2页
第2页 / 共22页
排序算法性能分析说明书.docx_第3页
第3页 / 共22页
排序算法性能分析说明书.docx_第4页
第4页 / 共22页
排序算法性能分析说明书.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

排序算法性能分析说明书.docx

《排序算法性能分析说明书.docx》由会员分享,可在线阅读,更多相关《排序算法性能分析说明书.docx(22页珍藏版)》请在冰豆网上搜索。

排序算法性能分析说明书.docx

排序算法性能分析说明书

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

实践教学

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

 

兰州理工大学

计算机与通信学院

2012年春季学期

 

数据结构课程设计

 

题目:

排序算法性能分析

专业班级:

计算机科学与技术

姓名:

魏志强

学号:

10500118

指导教师:

张永

成绩:

_________________

目录

摘要1

1.采用类c语言定义相关的数据类型4

2.各模块的伪码算法5

3.函数的调用关系图11

4.调试分析11

5.测试结果13

6.源程序(带注释)16

总结28

参考文献29

致谢30

附件Ⅰ部分源程序代码31

 

摘要

排序是计算机程序设计中的一种重要操作。

各种部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。

关键字:

排序,性能分析。

排序:

计算机内正常进行的一种操作,其目的是将一组"无序"的纪录序列调整为"有序"的纪录序列.其分为内部排序与外部排序.内部排序的过程是一个逐步扩大记录的有序序列长度的过程.内排序的方法有多种,按照所用策略的不同,可归纳为5类:

插入排序,选择排序,快速排序,希尔排序,冒泡排序.

性能分析:

通过输入相同的数组对不同的排序法则从得出的排序的比较次数,移动次数,从而比较各分析排序的优虐.

 

1.采用类c语言定义相关的数据类型

Int整型,inta[100]:

定义一个整形变量其容量为100.intn,intct,intmt,inttemp.char字符型

2.各模块的伪码算法

(1)插入排序伪码算法:

VoidInsertSort(Splist&L){

For(i=2;i<=L.length;++i)

If(LT(L.r[i].key,L.r[i-1].key))  //“《”,须将L.r[i]插入有序子表

{L.r[0]=L.r[i];         //复制为哨兵

L.r[i]=L.r[i-1];

For(j)i-2;LT(L.r[0].key,L.r[j].key);--j)

L.r[j+1]=L.r[j];         //记录后移

L.r[j+1]=L.r[0];//插入到正确位置

}

}//InsertSort

(2)希尔排序

VoidshllInsert(Splist&L,intdk){

For(i=dk+1;i<=L.length;++i)

If(LT(L.r[i].key,L.r[i-dk].key)) {

L.r[0]=L.r[i];           //暂存

For(j=i-dk;j>0&<(L.r0].key,L.r[j].key);j-=dk)

L.r[j+dk]=L.r[j];       //记录后移

L.r[j+dk]=L.r[0];}//插入

}//shellsort

Voidshllsort(Splist&L,intdata[],intt){

For(k=0;k

shllInsert(L,data[k]);

}//shellsort

(3)快速排序

Intpart(sqlist&L,intlow,inthigh){

//交换顺序表L中子表L。

R[low..high]的记录,使枢轴记录到位,并返回其所在位

 // 此时在它之前(后)的记录均不大(小)于它。

Pivotkey=L.[Low].key;

While(loe

While(low=pivotkey)--high;

L.r[lowL.r[high];

While(low=pivotkey)++low;

L.r[lowL.r[high];

}

Returnlow

}//partition

(4)选择排序

Voidselectsort(splist&L){

For(i=1;i

J=selectMinKey(L,i);

If(i!

=j)L.r[i]L.r[j];

}

}//selectsort

(5)其泡排序

Voidbubblesort(sqlistr,intn){

IntI,j,w;

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

For(j=n;j>=i+1;j--)

If(r[j].key

{    

W=r[j];

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

R[j-1]=w;}

3.函数的调用关系图

 

Main

Insertionsortquicksortbubblesortselectionsortshellsort

 

Output比较ct.mt次数

 

4.调试分析

a、调试中遇到的问题及对问题的解决方法

刚开始进行输入时,对有些排序不能实现,我就对不能实现的排序进行分析,对产生的语法错误进行了及时的改正,以至所有的排序算法能够顺利的实现。

b、算法的时间复杂度和空间复杂度

算法的时间复杂度分别是O(n2),

O(nlog2n),O(log2n),

5.调试结果

234561381

321245394637100200

6.源程序:

#include

#defineN100//定义数组最大为100

constintt=3;//定义希尔排序次数

intd[3]={4,3,1};//定义希尔排序比较量

intqmt;//快速排序的移动次数

intqct;//快速排序的比较次数

voidoutput(intn,inta[],intct,intmt)//内部排序中调用的输出函数

{

inti;

printf("\n排序结果:

");

for(i=0;i

printf("%d",a[i]);//输出各排序完成的数组

printf("\n比较次数:

%d\n",ct);//输出各排序比较次数

printf("移动次数:

%d\n\n",mt);//输出各排序移动次数

}

voidbubble_sort(intn,intA[])//冒泡排序

{

intmt=0;//移动次数mt=movetime

intct=0;//比较次数ct=cmdtime

inti,j,temp;

inta[N];

for(i=0;i

a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)

for(i=0;i

{

for(j=0;j

{

if(a[j+1]

temp=a[j],

a[j]=a[j+1],

a[j+1]=temp,

mt+=3;//关键字交换计为3次移动

}

}

printf("冒泡排序");

output(n,a,ct,mt);

}

voidselection_sort(intn,intA[])//选择排序

{

intmt=0;//移动次数movetime

intct=0;//比较次数cmdtime

inti,j,temp,k;

inta[N];

for(i=0;i

a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)

for(i=0;i

{

k=i;

for(j=i+1;j

if(a[k]>a[j])

k=j;

temp=a[i],

a[i]=a[k],

a[k]=temp,

mt+=3;//关键字交换计为3次移动

}

printf("选择排序");

output(n,a,ct,mt);

}

voidquick(inta[],intlow,intup)//快速排序递归算法

{

inti,j,temp;

if(low

{

i=low;

j=up;

temp=a[low],

qmt++;

while(i!

=j)

{

qct++;

while(itemp)

j--,

qct++;

if(i

a[i++]=a[j],

qct++;

qmt++;

while(i

i++,

qct++;

if(i

a[j--]=a[i],

qct++,

qmt++;

}

a[i]=temp,

qmt++;

quick(a,low,j-1);

quick(a,i+1,up);

}

}

voidquick_sort(intn,intA[])//快速排序(通过调用快速排序递归算法完成)

{

inti;

inta[N];

for(i=0;i

a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)

quick(a,0,n-1);//调用快速排序递归算法

printf("快速排序");

output(n,a,qct,qmt);

}

voidinsertion_sort(intn,intA[])//插入排序

{

intmt=0;//移动次数movetime

intct=0;//比较次数cmdtime

inti,j,temp;

inta[N];

for(i=0;i

a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)

for(i=1;i

{

temp=a[i],

mt++;

for(j=i-1;j>=0&&temp

a[j+1]=a[j],

mt++;

a[j+1]=temp,

mt++;

}

printf("插入排序");

output(n,a,ct,mt);

}

voidshell_sort(intn,intA[])//希尔排序

{

intmt=0;//移动次数movetime

intct=0;//比较次数cmdtime

inti,j,k,h,y;

inta[N];

for(i=0;i

a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)

for(i=0;i

{

h=d[i];

for(j=h;j

{

y=a[j],

mt++;

for(k=j-h,ct++,mt++;k>=0&&y

a[k+h]=a[k];

a[k+h]=y;

}

}

printf("希尔排序");

output(n,a,ct,mt);

}

voidmain()

{

intn;

inti;

intA[N];

printf("请输入数组大小(小于100):

");

scanf("%d",&n);//输入所需排序数组大小

for(i=0;i

{

printf("请输入数组a[%d]:

",i);

scanf("%d",&A[i]);//依次输入数组A[0]~A[n]

}

bubble_sort(n,A);//冒泡排序

insertion_sort(n,A);//插入排序

selection_sort(n,A);//选择排序

quick_sort(n,A);//快速排序

shell_sort(n,A);//希尔排序

}

 

总结

在这两周的数据结构课程设计中,我的题目是:

排序算法性能分析,这两周课程设计中,通过该题目的设计过程,我加深了对排序算法的理解,对排序算法上基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

一个人要完成所有的工作是非常困难和耗时的。

在以后的学习中我会更加注意各个方面的能力的协调发展。

在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题解决,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。

两周的课程设计很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,来配合学习,两周中我收益很大,学到很多。

 

参考文献

1.严蔚敏,吴伟民,《数据结构(C语言版)》,清华大学出版社。

2.严蔚敏,吴伟民,《数据结构题集(C语言版)》,清华大学出版社。

3.《DATASTRUCTUREWITHC++》,WilliamFord,WilliamTcpp,清华大学出版社(影印版)。

4.谭浩强,《C语言程序设计》,清华大学出版社。

 

 

致谢

首先感谢我的指导老师张永张老师,他在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。

感谢我的数据结构老师老师和C语言老师在以往的基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。

我的同学在设计完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。

 

附件1源代码如下

深度遍历算法的实现

源码如下

#defineMAX_VER20

#include"stdio.h"

typedefstruct

{intadj;

char*info;

}arccell;

typedefstruct

{charvexs[MAX_VER];

arccellarcs[MAX_VER][MAX_VER];

intvexnum,arcnum;

intgraphkind;

}mgraph;

mgraphG;

intvisited[MAX_VER];

intcreateDG();

intlocate();

intvisit();

charfirst();

charnext();

voidDFS();

intcreateDG(mgraph*p)

{inti,j,k,n;

charv1,v2;

printf("givethenumberofvertexandarc:

\n");

scanf("%d%d",&(p->vexnum),&(p->arcnum));

printf("\nvexnum=%d,arcnum=%d\n",p->vexnum,p->arcnum);

printf("givethevexs:

\n");

for(i=0;ivexnum;i++)

{p->vexs[i]=getch();

printf("%3c",p->vexs[i]);

}

for(i=0;iarcnum;i++)

for(j=0;jvexnum;j++)

p->arcs[i][j].adj=0;

printf("\nthearcsare:

\n");

for(i=0;iarcnum;i++)

{for(j=0;jvexnum;j++)

printf("%3d",p->arcs[i][j].adj);

printf("\n");

}

for(k=0;karcnum;k++)

{printf("givethetwovexsbetweenwhichtherearearc:

\n");

v1=getch();v2=getch();

printf("%c%c\n",v1,v2);

i=locate(G,v1);j=locate(G,v2);

if(i>=0&&j>=0)p->arcs[i][j].adj=1;

}

printf("nowthearcs:

\n");

for(i=0;iarcnum;i++)

{for(j=0;jvexnum;j++)

printf("%3d",p->arcs[i][j].adj);

printf("\n");

}

return1;

}

intlocate(mgraphG,charv)

{inti;

for(i=0;i

if(v==G.vexs[i])returni;

return-1;

}

intvisit(mgraphG,charv)

{inti;

i=locate(G,v);

if(i>=0)

{printf("%c",v);return1;}

else

return0;

}

charfirst(mgraphG,charv)

{inti,j;

i=locate(G,v);

for(j=0;j

if(G.arcs[i][j].adj==1)

returnG.vexs[j];

return-1;

}

charnext(mgraphG,charv1,charv2)

{inti,j;

i=locate(G,v1);j=locate(G,v2);

for(j++;j

if(G.arcs[i][j].adj==1)

returnG.vexs[j];

return-1;

}

voidDFS(mgraphG,charv)

{inti,j,k;

charw;

i=locate(G,v);

j=visit(G,v);

if(j)visited[i]=1;

for(w=first(G,v);w>=0;w=next(G,v,w))

{k=locate(G,w);

if(!

visited[k])DFS(G,w);

}

for(i=0;i

{if(visited[i]==0)

visit(G,G.vexs[i]);visited[i]=1;

}

return;

}

main()

{mgraph*p;

inti,j;

charv;

p=&G;

clrscr();

createDG(p);

for(i=0;i

visited[i]=0;

printf("thevisited:

\n");

for(i=0;i

printf("%3d",visited[i]);

printf("\n");

printf("thefirsttovisit:

\n");

v=getch();

printf("%c\n",v);

DFS(G,v);

printf("\nnowthevisited:

\n");

for(i=0;i

printf("%3d",visited[i]);

}_

 

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

当前位置:首页 > 工作范文 > 行政公文

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

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