T044 二分搜索(含鬼畜压行写法)

用二分的前提是数据已经升序排好,切记切记

#include<stdio.h>

int BSearch(int A[],int n,int key)//A[]存放数据的数组;n数据个数;key要搜索内容
{
    int l, r, m;
    l=0,r=n-1;
    while(l<=r)
    {
        m=l+(r-l)/2;//不用(l+r)/2避免数据溢出
        if(A[m]<key)//向右查找
            l=m+1;
        else if(A[m]>key)//向左查找
            r=m-1;
        else return m;//找到
    }
    return -1;
}

int binSearch(int a[], int begin, int end, int k)//比较鬼畜的写法。。压行不是梦。。
{
    int mid = begin + ( (end - begin)>>1 ),index;
    index = a[mid] < k && begin + 1 <= end ? binSearch(a,mid+1,end,k) :
          ( a[mid] > k && begin + 1 <= end ? binSearch(a,begin,mid,k) :
            mid * (a[mid] == k) + (a[mid] != k)*(-1));
    return index;
}

int main()
{
    int n, i, key, result, result1;
    int A[100];
    scanf("%d", &n);
    for(i=0;i<n;i++)
    {
        scanf("%d", &A[i]);
    }
    scanf("%d", &key);
    result=BSearch(A,n,key);
    result1=binSearch(A,0,n-1,key);
    if(result>=0) printf("%d\n", result);//下标大于等于0即找到该数据
    else puts("null");
    if(result1>=0) printf("%d\n", result1);
    else printf("null\n");
    return 0;
}

 

posted @ 2015-11-11 20:36  striderdu  阅读(196)  评论(0)    收藏  举报