软件编程
位置:首页>> 软件编程>> C语言>> C语言折半查找法的超详细讲解

C语言折半查找法的超详细讲解

作者:一个爱好编程的大学生i  发布时间:2022-10-26 19:33:16 

标签:c语言,折半,查找

折半查找法仅适用于对已有顺序的数组、数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid=(high+low)/2。注意:low,mid,high都要与下标绑定,也就是说它们就是下标。且循环条件是:high>=low.

同时注意:⑴若原来数组是由小到大排列的则:

      mid=(high+low)/2;
            if(key<a[mid])//说明要找的值在左边
            high=mid-1;
            else if(key>a[mid])//说明要找的值在mid右边
            low=mid+1;//最小值的位置往右进一位

㈡若原来数组是由大到小排列的则:

mid=(high+low)/2;
            if(key>a[mid])//注意是由大到小排列 ,所以此时key在a【mid】 左边,故high=mid-1 ;
            high=mid-1;
            else if(key<a[mid])//注意是由大到小排列,所以此时key在a【mid】右边,故low=mid+1;
            low=mid+1;

当然在下面这个代码中,也可以用选择排序法和冒泡法来对任意数组进行排序,然后在应用此函数,保证折半查找法的前提是排好序了。

#include<stdio.h>
void zb(int key,int a[],int n)//key表示要找的数,a表示数组,n表示数组元素个数
{
    int i,high,low,mid;
    int count1=0,count=0;
    low=0;
    high=n-1;
    while(high>=low)//保证右下标不小于左下标
    {    
       count++;
       mid=(high+low)/2;//总的来说变得是中间位置相当于把中间位置移到了key那个数那里,所以mid应该处于循环里面
        if(key<a[mid])//说明key在a【mid】的左半边 ,那么最右边的high下标就可以在下标mid基础上往左进一个单位了
       high=mid-1;
        else if(key>a[mid])//说明key在a【mid】的右半边 ,那么最左边的low下标就可以在下标mid基础上往右进一个单位了
        low=mid+1;
       if(key==a[mid])
       {
           printf("元素找到了!!!\n一共查找了%d次\n它处于a[%d]位置上\na[%d]=%d\n",count,mid,mid,key);
           count1++;
           break;
       }
   }
    if(count1==0)
    printf("元素不存在!!!\n");
}
int main ()
{
    int key,n,a[100];
    int i;
    void zb(int key,int a[],int n);//声明定义函数
    printf("请输入数组元素个数:\n");
    scanf("%d",&n);
    printf("请输入(从小到大)所有数组元素:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("请输入要查找的数:\n");
    scanf("%d",&key);
    zb(key,a,n);
    printf("\n");
    return 0;
}

来源:https://blog.csdn.net/m0_56168966/article/details/121390236

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com