代码:swust oj 查找(0204)

题目:



题目分析:所谓无序,则是按输入时的顺序;有序,则是从小到大排序后的顺序;二分,也需要排序后二分,才有意义.

那么,不妨用三个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.









发布了48 篇原创文章 · 获赞 21 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_33810513/article/details/50639956