C语言成长之路48:二分查找法

声明:本笔记基于 B站UP主「来自程序员的暴击」的 「C语言成长之路」中对应课程; 

介绍:

  二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

 

查找过程:
  首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
 
注意事项:
  1.必须采用顺序存储结构。 
  2.必须按关键字大小有序排列。 
 
优与劣:
  优点是比较次数少,bai查找速度快,平均du性能好;
  缺点是要bai求待查表为有序表,且插入删除困难;

代码:
 1 void binarySearch(int a[],int aSize,int searchTarget){
 2     /*  二分查找法  */
 3     /*  注:二分查找必须传入的是一个按照数字大小排序的数组,否则无法正常查找  */
 4     int firstNum = 0;
 5     int lastNum = (aSize / 4) - 1;
 6     int flag = 0;                                                               //  设定一个值,用来最后判定是否查找出需要找的数字
 7     printf("Start to find targetNum %d\n",searchTarget);
 8     while (firstNum <= lastNum){                                                //  循环条件
 9         int mid = (firstNum + lastNum) / 2;                                     //  由于二分查找法是通过折半查找,取数组长度的一半进行判定,所以需要设置中位数,但这样写有溢出问题
10         printf("mid = %d\n",mid)
11         if (searchTarget == a[mid]){                                            //  当目标数字和数组的中位数相等,即找到目标,进行输出
12             printf("Find the target [%d]\n",a[mid]);
13             flag = 1;                                                           //  更改flag的状态
14             break;                                                              //  由于已经找到了目标,跳出循环
15         } else if (searchTarget > a[mid]){                                      //  由于目标大于中位数的值得
16             firstNum = mid + 1;                                                 //  重新定义下一次搜索的范围的最小值
17             printf("<fail, next step>    firstNum --> %d\n",firstNum);
18         } else if (searchTarget < a[mid]) {                                     //  由于目标小于中位数的值
19             lastNum = mid - 1;                                                  //  重新定义下一次搜索范围的最大值
20             printf("<fail, next step>    lastNum --> %d\n",lastNum);
21         }
22     }
23     if (flag == 0){                                                             //  当flag仍然为0时,啧表示无法找到目标数字,输出文字
24         printf("I can't find the targetNum(%d) from list a.",searchTarget);
25     }
26 }
27 
28 
29 void main(){
30     int a[100] = {0};                   //  定义一个有100个元素的数组
31     for (int i = 0;i < 100;i++){        //  通过自增1的方式,填充数组,由于是自增1的方式,所以是按照一定排列顺序排列
32         a[i] = i;
33     }
34     int targetNum = 77;                 //  设定需要查找的值
35     int aSize = sizeof(a);              //  获取数组长度
36     binarySearch(a,aSize,targetNum);    //  调用方法
37 };

 

posted @ 2020-08-18 19:44  Akne  阅读(196)  评论(0编辑  收藏  举报