数据结构与算法.docx

上传人:b****5 文档编号:3253075 上传时间:2022-11-21 格式:DOCX 页数:13 大小:154.46KB
下载 相关 举报
数据结构与算法.docx_第1页
第1页 / 共13页
数据结构与算法.docx_第2页
第2页 / 共13页
数据结构与算法.docx_第3页
第3页 / 共13页
数据结构与算法.docx_第4页
第4页 / 共13页
数据结构与算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构与算法.docx

《数据结构与算法.docx》由会员分享,可在线阅读,更多相关《数据结构与算法.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构与算法.docx

数据结构与算法

目录

一、设计题目2

1.选题要求2

2、设计目的2

二、设计内容2

三、概要设计2

3.1、原始数据2

3.2、输出数据3

3.3模块间调用关系3

3.4调用关系图3

四、算法描述4

4.1主程序模块4

4.2可排序表单元模块5

4.3输出格式模块9

五、算法分析9

5.1原理分析10

5.2算法时间复杂度分析:

10

5.2.1、冒泡排序:

bubbleSort()10

5.2.2、选择排序:

SelectSort10

5.2.3、直接插入排序:

insSort()11

5.2.4、快序排序:

QuickSort(d)11

六、程序运行结果12

6.1.首次运行截图12

6.2.输入想要排列的数据进入下一步12

6.3输入1显示各排列后的数字和相关信息13

七、心得体会13

八、参考资料14

一、设计题目

1.选题要求

内部排序算法的性能分析

2、设计目的

(1)掌握各种排序的基本思想。

(2)掌握各种排序方法的算法实现。

(3)掌握各种排序方法的优劣分析及花费的时间的计算。

二、设计内容

利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。

采用各种内排序方法(直接插入、、简单选择、冒泡、快速进行)排序,需对每一种排序算法的实际执行时间进行列表比较,并对各种排序算法进行定量的性能分析。

待排序表的元素关键字为整数,用不同的测试数据做测试比较。

比较的指标为关键字的比较次数和关键字的移动次数。

三、概要设计

3.1、原始数据

用户输入记录的个数,数据由随机数产生器生成。

3.2、输出数据

产生的随机数分别选用起泡排序、直插排序、选择排序、快速排序、这些排序方法进行排序,输出排列后的数据,计算各种排序的复杂度。

3.3模块间调用关系

(1).Main调用SelectSort;InsertSort;BubbleSort;

QuickSort;Output(a,n);

用到的语句有:

use.SelectSort(a,n);use.InsertSort(a,n);use.BubbleSort(a,n);se.QuickSort(a,n);

(2)QuickSort调用Qsort函数

用到的语句有:

Qsort(a,0,n-1);

3.4调用关系图

图1调用关系

四、算法描述

4.1主程序模块

主函数代码:

voidmain()

{

ofstreamoutfile("text.txt",ios:

:

out);//把数据以文档形式输出

Sortuse;

intn;

cout<<"输入元素个数:

"<

cin>>n;//输入想要排列的数字

while

(1)

{

cout<<"1:

各种排序方法并分析:

"<

cout<<"2:

分析各种排序方法利与弊:

"<

cout<<"3:

退出排序算法的分析程序:

"<

cout<<"请输入选择排序方法"<

intnumber;//输入要执行的数字。

cin>>number;

int*a=newint[n];

for(inti=0;i

{

a[i]=rand()%1000;//通过调用产生随机数据;

outfile.put(char(a[i]));

}

outfile.close();

switch(number)

{

case1:

use.SelectSort(a,n);//调用选择排序函数

use.Output(a,n);//调用输出形式的函数

cout<<"选择排序算法:

"<

cout<<"数据个数"<<""<<"执行时间"<<""<<"比较次数"<<""<<"交换次数"<<""<<"移动次数"<<""<<"执行次数"<

cout<

}

主函数流程图

图2主函数流程图

4.2可排序表单元模块

A.选择排序

template//模版

voidSort:

:

SelectSort(Ta[],intn)

{

start1=clock();//计算开始的时间

intsmall;

for(inti=0;i

{

excute[0]++;//执行次数加一次

small=i;//最小值等于i

for(intj=i+1;j

if(a[j]

{

inttemp=a[i];//定义temp为数组a

a[i]=a[small];//把最小值赋予i

a[small]=temp;//把temp赋予数组中小的那数

}

exchange[0]++;//交换次数加1

move[0]+=3;//移动次数加3

}

finish1=clock();//计算结束时的时间

}

B.起泡排序

voidSort:

:

BubbleSort(Ta[],intn)

{

inti,j,flag,p;

for(i=0;i

{++compare[2];//比较次数加1

excute[2]++;//执行次数加一次

flag=1;//说明此趟排序有元素交换的动作

for(j=1;j<=n-i;j++)如果i小于n-1进行循环

{

if(a[j+1]

{

flag=0;说明此趟排序无元素交换的动作

p=a[j];

a[j]=a[j+1];//j+1的值赋给j

a[j+1]=p;//p的值赋给j+1

}move[2]=move[2]+3;//移动次数加3

}exchange[2]++;//交换次数加2

if(flag==1)

return;

}

}

voidBubbleSort(Ta[],intn);

C.直接插入排序

voidSort:

:

InsertSort(Ta[],intn)

{

start2=clock();//开始计时

for(inti=1;i

{

excute[1]++;//执行次数加一次

intx=a[i];//定义整整型x=a[i]

move[1]++;//移动次数加1

for(intj=i-1;j>=0&&x

{

compare[1]++;//比较次数加1

a[j+1]=a[j],exchange[1]++;//交换次数加1

move[1]++;//移动次数加1

}

compare[1]++;//比较次数加1

a[j+1]=x;

}

finish2=clock();

}

voidInsertSort(Ta[],intn);、

D.快速排序

voidSort:

:

QuickSort(Ta[],intn)

{

excute[3]++;//执行次数加一次

start4=clock();

Qsort(a,0,n-1);//调用Qsort函数

cout<

cout<

finish4=clock();

}

template

voidSort:

:

Qsort(Ta[],intleft,intright)

{

inti,j;

if(left

{

compare[3]++;//比较次数加1

i=left;

j=right+1;

do{

doi++;while(a[i]

doj--;while(a[j]>a[left]);compare[3]++;//比较次数加1

if(i

a[j]=temp;//temp的值赋给a[j]

move[3]++;exchange[3]+=3;}//移动次数加3,交换次数加3

}

while(i

intnum=a[left];

a[left]=a[j];

a[j]=num;

move[3]++;

exchange[3]+=3;

Qsort(a,left,j-1);excute[3]++;//执行次数加1

Qsort(a,j+1,right);excute[3]++;//执行次数加1

}

}

4.3输出格式模块

voidSort:

:

Output(Ta[],intn)

{

for(intq=0;q

{

if((q!

=0)&&(q%15==0))//每行输出15个

{

cout<

}

cout<

}

cout<

图3For循环流程图

五、算法分析

5.1原理分析

(1)选择排序

基本思想:

在待排序的一组数据元素中,选出最小的一个数据元素与第一个位置的数据元素交换;然后在剩下的数据元素当中再找最小的与第二个位置的数据元素交换,循环到只剩下最后一个数据元素为止。

(2)起泡排序

基本思想:

相邻的两个元素进行比较,将小的调到前面,大的调到后面。

(3)直接插入排序

待排序的记录放在数组R[0…n-1]中排序过程中某一时刻,R被划分成两个子区间R[0…i-1](有序和)R[i…n-1](无序)。

直接插入的基本操作是将当前无序区的一个记录R[i]插入到有序区R[0…i-1]中适当的位置

(4)快速排序

基本思想:

在待排序的数组的n个元素中取一个元素(一般取第一个),将其移动到这样的位置:

在其之前的元素的值都小于它,在其之后的元素都大于它,这样是一趟快速排序;然后对数组的两个部分进行同样的操作。

5.2算法时间复杂度分析:

5.2.1、冒泡排序:

bubbleSort()

冒泡排序算法分析:

(1)最好情况,待排序的文件已是有序文件:

只需要进行1趟排序,共计比较关键字的次数为n-1,不交换记录。

(2)最坏情况,要经过n-1趟排序,所需总的比较关键字的次数为(n-1)+(n-2)+...+1=n(n-1)/2,交换记录的次数最多为(n-1)+(n-2)+...+1=n(n-1)/2移动记录次数最多为3n(n-1)/2。

(3)只需要少量中间变量作为辅助空间。

算法是稳定的。

5.2.2、选择排序:

SelectSort

选择排序算法分析:

(1)比较次数,在任何情况下,均为

(2)交换记录的次数,

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

当前位置:首页 > 小学教育 > 英语

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

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