实验4 查找排序的应用文档格式.docx
《实验4 查找排序的应用文档格式.docx》由会员分享,可在线阅读,更多相关《实验4 查找排序的应用文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
l、产生n个整数并存于数组r[1..n]中。
对主要查找算法(顺序查找、折半查找)和排序算法(直接插入排序、冒泡排序、快速排序、简单选择排序)进行实验比较,计算出平均比较次数、平均移动次数。
2、对实验结果数据进行对比分析。
1.#include<
iostream>
usingnamespacestd;
intcount;
intSepSearch(intr[],intkey,intlen)//顺序查找
{
inti;
count=0;
i=len;
while(key!
=r[i])
{
i--;
count++;
}
return(i);
intBinSrch(intr[],intkey,intlen)//折半查找
intlow,high,mid;
low=1;
high=len;
count=0;
while(low<
=high)
{count++;
mid=(low+high)/2;
if(key==r[mid])return(mid);
elseif(key<
r[mid])high=mid-1;
elselow=mid+1;
return(0);
voidBiInsertsort(intr[],intn)//插入排序(折半)
for(inti=2;
i<
=n;
i++)
{
if(r[i]<
r[i-1])
r[0]=r[i];
intlow=1,high=i-1;
while(low<
{
count++;
intmid=(low+high)/2;
if(r[0]<
r[mid])
high=mid-1;
elselow=mid+1;
}
intj;
for(j=i-1;
j>
high;
j--)
r[j+1]=r[j];
r[j+1]=r[0];
for(intk=1;
k<
k++)
printf("
%d"
r[k]);
printf("
\n"
);
voidBubbleSort(intr[],intn)//冒泡排序
inttemp,exchange,bound;
exchange=n;
while(exchange)//仅当上一趟排序有记录交换才进行本趟排序
bound=exchange;
exchange=0;
for(intj=1;
j<
bound;
j++)
if(r[j]>
r[j+1])
temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j;
for(i=1;
i++)
r[i]);
intPartition(intr[],intfirst,intend)//快速排序一次划分
inti=first;
intj=end;
r[0]=r[first];
count=1;
while(i<
j)
j&
&
r[0]<
=r[j])j--;
//右侧扫描
r[i]=r[j];
r[i]<
=r[0])i++;
//左侧扫描
r[j]=r[i];
r[i]=r[0];
returni;
//i为轴值记录的最终位置
voidQuickSort(intr[],intfirst,intend)//快速排序
if(first<
end)
intpivot=Partition(r,first,end);
QuickSort(r,first,pivot-1);
//递归地对左侧子序列进行快速排序
QuickSort(r,pivot+1,end);
//递归地对右侧子序列进行快速排序
voidSelectSort(intr[],intn)//简单选择排序
inti,j,index,temp;
for(i=1;
i<
n;
i++)
index=i;
for(j=i+1;
j++)
count++;
if(r[j]<
r[index])index=j;
if(index!
=i)
temp=r[i];
r[i]=r[index];
r[index]=temp;
for(i=1;
voidmain()
constintnumv=12;
inta[3][numv]={{0,6,13,19,23,37,39,41,45,48,58,86},{0,86,58,48,45,41,39,37,23,19,13,6},{0,23,13,48,86,19,6,41,58,37,45,39}};
intz1[numv],z2[numv];
intm,n,i,j;
ints1;
请选择测试数据类:
1正序2逆序3随机[若跳出,请按4]\n"
scanf("
%d"
&
m);
while(m>
0&
m<
4)
请选择操作算法:
1直接插入排序2冒泡排序3快速排序4简单选择排序5顺序查找6折半查找\n"
n);
switch(n)
case1:
printf("
直接插入排序前:
for(j=1;
j<
numv;
j++)
a[m-1][j]);
直接插入排序结果为:
BiInsertsort(a[m-1],numv-1);
移动了"
"
次\n"
count);
break;
case2:
冒泡排序前:
for(j=1;
冒泡排序结果为:
BubbleSort(a[m-1],numv-1);
case3:
printf("
快速排序前:
快速排序结果为:
QuickSort(a[m-1],0,numv-1);
a[m-1][i]);
case4:
简单选择排序前:
简单选择排序结果为:
SelectSort(a[m-1],numv-1);
case5:
请输入查找的数:
%d\n"
s1);
i=SepSearch(a[m-1],s1,numv-1);
用顺序查找法查找数"
在第"
位,"
比较了"
s1,i+1,count);
case6:
j=BinSrch(a[m-1],s1,numv-1);
用折半查找法查找数"
default:
输入错误!
m=0;
请选择测试数据类型:
1正序2逆序3随机[若跳出,请按4]:
if(m==4)printf("
(*^__^*)再见!
elseprintf("
实验结果:
(1)直接插入排序:
(2)冒泡排序:
(3)快速排序:
(3)快速排序
(4)简单选择排序
(5)顺序查找
(6)折半查找
2.1顺
2结果分析
(1)几种排序法的比较如下表:
排序方法
平均情况
最好情况
最坏情况
辅助空间
直接插入排序
O(n2)
O(n)
O
(1)
起泡排序
O(n)
快速排序
O(nlog2n)
O(log2n)~O(n)
简单选择排序
(2)顺序查找
平均查找长度:
ASL=1/2(n+1)
(3)折半法平均查找长度:
ASL=(n+1)/2*log2(n+1)-1
折半法查找方法优点是比较次数少,查找速度快,平均性能好,但要求查找的表为有序,且插入删除困难。
实验体会
排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。
通过这次上机实验,增加了我学习算法的兴趣,虽然还不是很懂,但从中也发现程序设计的乐趣,在上机过程中犯的一些错误还会有意外的收获,感觉写算法还是很有意思的。
在具体操作中对这学期所学的数据结构和以前学的C语言的理论知识得到巩固,也发现自己的不足之处,在以后的上机中应更加注意,通过实际操作,学会数据结构书中程序的编写方法和基本步骤,,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。