服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言折半查找法的超详细讲解

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

2022-12-26 16:02一个爱好编程的大学生i C/C++

折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要给大家介绍了关于C语言折半查找法的相关资料,需要的朋友可以参考下

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

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

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

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

?
1
2
3
4
5
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;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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;
 }

总结

到此这篇关于C语言折半查找法的文章就介绍到这了,更多相关C语言折半查找法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_56168966/article/details/121390236

延伸 · 阅读

精彩推荐
  • C/C++C++实现LeetCode(30.串联所有单词的子串)

    C++实现LeetCode(30.串联所有单词的子串)

    这篇文章主要介绍了C++实现LeetCode(30.串联所有单词的子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考...

    Grandyang7502021-11-25
  • C/C++C++ STL 四种智能指针的用法详解

    C++ STL 四种智能指针的用法详解

    C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天给大家详细介绍这几种指针的具体用...

    青年夏日10642021-11-19
  • C/C++C++实现LeetCode(137.单独的数字之二)

    C++实现LeetCode(137.单独的数字之二)

    这篇文章主要介绍了C++实现LeetCode(137.单独的数字之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang10842021-11-30
  • C/C++C语言职工管理系统设计

    C语言职工管理系统设计

    这篇文章主要为大家分享了一份C语言职工管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    _acme_8182021-04-18
  • C/C++浅析C语言中的数组及字符数组

    浅析C语言中的数组及字符数组

    这篇文章主要介绍了C语言中的数组及字符数组,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网5922021-03-17
  • C/C++c++ 实现KMP算法

    c++ 实现KMP算法

    这篇文章主要介绍了c++ 实现KMP算法的示例,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...

    袁君(Louis)8792021-09-29
  • C/C++快速了解Boost.Asio 的多线程模型

    快速了解Boost.Asio 的多线程模型

    这篇文章主要介绍了Boost.Asio 的多线程模型的相关知识,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...

    Boblim7862021-09-09
  • C/C++C++中string类的常用方法实例总结

    C++中string类的常用方法实例总结

    string类是C++提供的抽象数据类型,其支持可变长字符串,下面这篇文章主要给大家总结介绍了关于C++中string类的常用方法,文中通过实例代码介绍的非常详细...

    Goallegoal10632022-10-21