查找排序的应用Word下载.docx
《查找排序的应用Word下载.docx》由会员分享,可在线阅读,更多相关《查找排序的应用Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
实验内容和步骤
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、从排序的实验结果可能看出在列举的几种算法中,对于这个列子来说:
简单选择排序最稳定,效率最高;
快速排序次之;
折半插入再次;
然后是直接插入;
最后是冒泡。