题目:
题目分析:所谓无序,则是按输入时的顺序;有序,则是从小到大排序后的顺序;二分,也需要排序后二分,才有意义.
那么,不妨用三个void函数来实现三个部分.
二分:
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int i,n,se,a[105];
void wuxu()
{
int leap=0;
for(i=0;i<n;i++)
{
if(a[i]==se)
{
printf("%d\n%d\n",i,i+1);
leap=1;
break;
}
}
if(leap==0)printf("-1\n%d\n",n);
}
void youxu()
{
int k=0,leap=0;//k~time
sort(a,a+n);
for(i=0;i<n;i++)
{
k++;
if(a[i]==se)
{
printf("%d\n%d\n",i,i+1);
leap=1;
break;
}
else if(a[i]>se)break;
}
if(leap==0)printf("-1\n%d\n",k);
}
void erfen()
{
int min=0,max=n-1,mid,k=0,leap=0;//k~time
sort(a,a+n);
while(min<=max)
{
k++;
mid=(min+max)/2;
if(se==a[mid])
{
leap=1;
printf("%d\n%d\n",mid,k);
break;
}
else if(se>a[mid])min=mid+1;
else max=mid-1;
}
if(leap==0)printf("-1\n%d\n",k);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&se);//search
wuxu();
youxu();
erfen();
return 0;
}
这道题看上去并不算多难,但是坑很多,忽略了很多地方,下面是带解析的代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int i,n,se,a[105];//定义全局变量,否则赋了值的变量不能直接传到空函数中
void wuxu()
{
int leap=0;
for(i=0;i<n;i++)
{
if(a[i]==se)
{
printf("%d\n%d\n",i,i+1);
leap=1;
break;
}
}
if(leap==0)printf("-1\n%d\n",n);
}
void youxu()/*在有序顺序表查找失败时的查找次数不一定是顺序表长度.
注意有序顺序查找失败的判断条件与查找次数,开始时我用的代码是
void youxu()
{
sort(a,a+n);
wuxu();
}问题就出在查找失败时有序的查找次数是<=n的*/
{
int k=0,leap=0;//k~time
sort(a,a+n);
for(i=0;i<n;i++)
{
k++;
if(a[i]==se)
{
printf("%d\n%d\n",i,i+1);
leap=1;
break;
}
else if(a[i]>se)break;//如果se小于了数组的最小数,查找次数也该是1,否则怎么判断出se小于最小呢
}
if(leap==0)printf("-1\n%d\n",k);
}
void erfen()
{
int min=0,max=n-1,mid,k=0,leap=0;//k~time,time是系统参数,不能作变量名
sort(a,a+n);//需先排序,否则二分失去意义
while(min<=max)//while(1)??有没有觉得不太对劲?min一直在加,max一直在减,要min>max了怎么办.所以啦,用min<=max来限制
{
k++;
mid=(min+max)/2;
if(se==a[mid])
{
leap=1;
printf("%d\n%d\n",mid,k);
break;
}
else if(se>a[mid])min=mid+1;//mid已经在第一个if里排除了,解方程时可以直接min=mid或max=mid,但这个是一个一个隔断的数据唷,不能一概而论
else max=mid-1;
}
if(leap==0)printf("-1\n%d\n",k);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&se);//search
wuxu();//无序
youxu();//有序
erfen();//二分
return 0;
}
参考博客:http://blog.csdn.net/daoqin121/article/details/39321691
article written by Sneexy.