二分查找 (折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法。
【二分查找要求】:1.必须采用顺序存储结构          2.必须按关键字大小有序排列。
【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;
             其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找方法适用于 不经常变动而 查找频繁的有序列表。

【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
                              否则利用中间位置记录将表分成前、后两个子表, 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n))

#include <stdio.h>
int main ( )
{   int low ,high,mid, x ,i;
    int N  ;
     printf("
 输入整数N:")  ;
    scanf("%d",&N) ;
    int a[N] ;
    printf("
 输入N个整数:")  ;

    for (i=0  ; i<N ;i++)
        scanf("%d",&a[i]) ;

    printf("
 输入待查的元素:");
    scanf("%d",&x);

    low=0 ;    high=9 ;
    while (low<=high)
    {
        mid=(low+high)/2 ;
        if (a[mid]==x)
        {
            printf("%d 的位置是:%d
",x,mid);
            break;
        }

        if (a[mid]<x)  low=mid+1 ;
        else           high=mid-1;
 }

    if (low>high)  printf("%d不存在
",x)  ;
}
View Code

View Code

#include <stdio.h> //二分查找:
int search(int a[],int x,int n) //x为要查找的元素,n为数组长度
{
int mid=0; int low=0; int high=n;
while (low<=high)
{
mid=(low+high)/2;
if (a[mid]==x) return mid;

else if (x<a[mid]) return high=mid-1;

else return low=mid+1 ; 
}
return -1;
}

int main()
{
int i,a[10],x;
for (i=0;i<10;i++)
scanf("%d",&a[i]);

printf("请输入要查找的元素 ");
scanf("%d",&x);

if (search(a,x,10)!=-1) 
printf("查找的元素在数组中的位置为%d. ",search(a,x,10));
else printf("该元素不在数组中 ");
return 0;
}

#include <stdio.h>
void fsort(int a[], int i,int num);
main()
{    int a[4]={2,10,19,25};
    int num;
    printf("请输入要查找的号码:");
    scanf("%d",&num);//二分法 a[]为数组,n为数组大小,num为要查找的数字
    fsort(a,4,num);
}
void fsort(int a[],int n,int num)
{
    int high,low,mid;
   int flag = 1;
    high=n-1;      low=0;
    while (low<=high)
    {
        mid = (high+low)/2;
        if (a[mid]<num)           {      low = mid+1;   }
        else if (a[mid]>num)      {      high = mid -1; }
        else
        {
            printf("位置在第%d位:",mid+1);
            printf("%d
",a[mid]);
            flag = 0;
            break;
        }
    }  
     if (flag)   {        printf("无此数字");}
}
View Code

View Code

#include <stdio.h>
int main ( )
{
int a[10]={ 0,4,5,6,13,27,50,90,100,999} ;
int low ,high,mid, x ;
printf(" 输入待查的元素:");
scanf("%d",&x);

low=0 ; high=9 ;
while(low<=high)
{
mid=(low+high)/2 ;
if(a[mid]==x) 
       {     printf("%d 的位置(下标)是:%d ",x,mid);      break;    }



if(a[mid]<x)    low=mid+1 ;
else              high=mid-1;


}


if(low>high) printf("%d不存在 ",x) ;


}

 

*************************************************************************************************************************************************

#include<stdio.h>
int fun(int a[],int low,int high,int x)
{
    if(a[(low+high)/2]==x)   return (low+high)/2;
    else if(x>a[(low+high)/2])  fun(a,a[(low+high)/2+1],high,x);
    else if(x<a[(low+high)/2])  fun(a,low,a[(low+high)/2-1],x);
}
 main()
{
    int i,a[100],low,high,mid,x;
        scanf("%d",&x);
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
        

    printf("%d
",fun(a,0,4,x)+1);
}
View Code

#include<stdio.h>

int fun(int a[],int low,int high,int x)

{

 if(a[(low+high)/2]==x)                return (low+high)/2;

 else if(x>a[(low+high)/2])               fun(a,a[(low+high)/2+1],high,x);

 else if(x<a[(low+high)/2])               fun(a,low,a[(low+high)/2-1],x);

}

 main()

{

 int i,a[100],low,high,mid,x;

  scanf("%d",&x);

 for(i=0;i<5;i++)  

 scanf("%d",&a[i]);   

 printf("%d ",fun(a,0,4,x)+1);

}

************************************************************************************************

查到了,输出元素下标 ; 没查到,返回-1

法一

#include <stdio.h>
#define N 10
int f(int a[],int low,int high,int x)
{
         int mid ;
     while (low<=high)
       {
            mid=(low+high)/2 ;
                    if (a[mid]==x)                    return        mid ;
                   else    if (a[mid]<x)              return    f(a,mid+1,high,x) ;
                   else                                    return     f(a,low,mid-1,x);
}
return -1 ;
}
int main ( )
{

int x, a[N]={ -1,12,23,42,56,65,81,92,100,109} ;
scanf("%d",&x);

printf("%d ",f(a,0,N-1,x));

}

 

法二

#include <stdio.h>
#define N 6
int f(int a[],int low,int high,int x)
{
               int mid =(low+high)/2 ;

if (low>high)                               return  -1 ;


else         if (a[mid]==x)              return   mid ;
else        if (a[mid]>x )                return     f(a,low,mid-1,x);
else                                           return      f(a,mid+1, high,x);


}
int main ( )
{

int x, a[N]={ 1,2,3,5,6,7} ;
scanf("%d",&x);
printf("%d ",f(a,0,N-1,x));

}

原文地址:https://www.cnblogs.com/2014acm/p/3893000.html