• 二分查找 (折半查找)


    二分查找又称折半查找,它是一种效率较高的查找方法。
    【二分查找要求】: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));

    }

  • 相关阅读:
    行定位符、单词定界符实例用法
    什么是正则表达式?
    PHP正则表达式语法汇总
    PDO中的存储过程的详细介绍
    PDO中的事务处理具体介绍
    PDO中错误处理的方法
    PDO中错误处理的方法
    使用默认模式-PDO::ERRMODE_SILENT
    PDO中执行SQL语句的三种方法
    使用默认模式-PDO::ERRMODE_SILENT
  • 原文地址:https://www.cnblogs.com/2014acm/p/3893000.html
Copyright © 2020-2023  润新知