1. 什么是二分法?
二分法是C语言中一种常用的查找指定数据的算法思想,使用二分法的前提是一组数据必须是有序的(升序或降序)。
2. 二分法的使用
(1)二分法的核心思想是用数组中(假设是一维数组)的中间元素和要查找的数字进行比较,每次比较都可以去掉一半的数据筛选的效率非常高。
其中要注意的地方是如何求中间元素的下标,我们通常定义两个变量left和right,left表示数组ky最左端的元素下标,right表示数组最右端的元素下标,那么中间元素的下标为mid=(left+right)/2,为了避免数据溢出,我们计算中间元素的下标时也可用mid=(right-left)/2+left。
(2)代码举例:
这是升序的例子
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7;//要查找的数字 int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1; int flag = 0; while (left <=right) { int mid = (right - left) / 2 + left;//找出数字中的中间元素 if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else { printf("找到了,下标是%d\n", mid); flag = 1; break; } } if (flag == 0) { printf("找不到了\n"); } return 0; }
画图描述:
重点是mid和左右下标的更新,
每次当中间元素的值<指定值时,left=mid+1,此时left左边的数据全部不符合,一次性就筛选了一半;
每次当中间元素的值>指定值时,right=mid-1,此时right右边的数据全部不符合,一次性又筛选了一半。
当要查找的数字是7时,运行的结果是:
当要查找的数字是17时: