查找排序的应用Word下载.docx

上传人:b****7 文档编号:22378986 上传时间:2023-02-03 格式:DOCX 页数:18 大小:118.11KB
下载 相关 举报
查找排序的应用Word下载.docx_第1页
第1页 / 共18页
查找排序的应用Word下载.docx_第2页
第2页 / 共18页
查找排序的应用Word下载.docx_第3页
第3页 / 共18页
查找排序的应用Word下载.docx_第4页
第4页 / 共18页
查找排序的应用Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

查找排序的应用Word下载.docx

《查找排序的应用Word下载.docx》由会员分享,可在线阅读,更多相关《查找排序的应用Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

查找排序的应用Word下载.docx

实验内容和步骤

l、产生n个整数并存于数组r[1..n]中。

对主要查找算法(顺序查找、折半查找)和排序算法(直接插入排序、冒泡排序、快速排序、简单选择排序)进行实验比较,计算出平均比较次数、平均移动次数。

2、对实验结果数据进行对比分析。

源程序:

查找:

1)顺序查找:

#include<

stdio.h>

#defineN23

ints=0;

typedefstruct

{

intkey;

}RecordType;

intSeqsearch(RecordTyper[],intk)

inti=N-1;

while(++s&

&

r[i].key!

=k)

i--;

returni;

}

main()

inti,x,j;

RecordTyper[N];

scanf("

%d"

&

x);

//

freopen("

in.txt"

"

r"

stdin);

for(i=1;

i<

N;

i++)

scanf("

r[i].key);

printf("

%d"

r[i].key);

printf("

\n"

);

j=Seqsearch(r,x);

if(j>

0)

{

查找的数在第%d个\n"

j);

平均查找次数为%f:

s*1.0/(N-1));

}

else

查找的数不在列表中\n"

2)折半查找:

#defineN23//元素个数

intn=0;

intBinsrch(RecordTyper[],intlow,inthigh,intk)

intmid;

while(low<

=high)

mid=(low+high)/2;

if(++s&

k==r[mid].key)

returnmid;

elseif(++s&

k<

r[mid].key)

high=mid-1;

else

low=mid+1;

return(0);

voidSelectSort(RecordTyper[])

RecordTypex;

intk,i,j;

N-1;

k=i;

for(j=i+1;

j<

=N-1;

j++)

if(r[j].key<

r[k].key)

k=j;

if(k!

=i)

{

x=r[i];

n++;

r[i]=r[k];

r[k]=x;

}

SelectSort(r);

j=Binsrch(r,1,N-1,x);

平均移动次数为%f:

n*1.0/(N-1));

排序:

1)直接插入排序:

//记录比较次数

voidInSort(RecordTyper[],intlength)

inti,j;

for(i=2;

length;

r[0]=r[i];

n++;

j=i-1;

while(++s&

r[0].key<

r[j].key)

{

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

n++;

j=j-1;

}

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

inti;

排序前顺序:

InSort(r,N);

排序后顺序:

平均比较次数为:

%f\n"

平均移动次数为:

;

return;

2)冒泡排序:

#include<

//记录移动次数

voidBubbleSort(RecordTyper[])

inti,j,change;

change=1;

N&

change;

++i)

change=0;

for(j=1;

N-i;

if(++s&

r[j].key>

r[j+1].key)

x=r[j];

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

r[j+1]=x;

change=1;

voidmain()

BubbleSort(r);

printf("

3)快速排序:

//s的位置?

math.h>

QKSass(RecordTyper[],intlow,inthigh)

{RecordTypex;

x=r[low];

high)

low<

high&

r[high].key>

=x.key)

high--;

if(low<

{

r[low]=r[high];

low++;

r[low].key<

x.key)

r[high]=r[low];

r[low]=x;

returnlow;

voidQKSort(RecordTyper[],intlow,inthigh)

intpos;

if(low<

pos=QKSass(r,low,high);

QKSort(r,low,pos-1);

QKSort(r,pos+1,high);

QKSort(r,1,N-1);

4)简单选择排序:

r[k].key&

++s)

5)折半插入排序:

voidBinSort(RecordTyper[],inty)

inti,low,high,mid,j;

=y;

x=r[i];

low=1;

high=i-1;

while(low<

mid=(low+high)/2;

x.key<

r[mid].key)high=mid-1;

elselow=mid+1;

for(j=i-1;

j>

=low;

--j)

BinSort(r,N-1);

实验结果:

1、顺序查找:

2、折半查找:

1)直接插入排序:

2)冒泡排序:

3)快速排序:

4)简单选择排序:

实验体会:

1、在调用各个程序时一定要注意形参和实参的对应。

2、最好每次成对输入各括号,然后再向里面添加内容,避免漏写的情况提高效率。

(在调试程序时,不一定会查出具位置,会浪费很多精力)

3、在统计比较次数时我用“S”的自增来表示,在写程序时,要写成“++S”因为如果是“S++”,如果它第一次就出现在“&

”语句中会导至结果出错,而且“++S”要写在最前面,因为如果条件不符合会直接跳出,而“++S”还未执行,这样比较就漏记了一次。

4、对于查找来说,不能单从个例的平均比较次来看算法的效率,看具体情况,比如顺序查找适合无序的少的数据,而折半适合有序大量的数据。

5、从排序的实验结果可能看出在列举的几种算法中,对于这个列子来说:

简单选择排序最稳定,效率最高;

快速排序次之;

折半插入再次;

然后是直接插入;

最后是冒泡。

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

当前位置:首页 > 工作范文 > 其它

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

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