C语言成长之路48:二分查找法
介绍:
二分查找也称折半查找(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 };