信息作业网站下载传播易广告投放平台
文章目录
- 一.二分查找简介
- 二.二分查找的原理
- 三.如何用C语言实现二分查找
一.二分查找简介
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
它的优点是查找速度快,缺点是待查表为有序表。
二.二分查找的原理
假如要在一个有序数组(记为arr[mid])中查找元素a,那么可以先找到数组中间的元素,记为arr[mid],将将该元素与a比较大小,若该元素大于a,那么可将该元素的下一项记为最左边的项,再将这个最左边的项和最右边的项的中间项与a比较大小,以此类推。
三.如何用C语言实现二分查找
如图所示,以这样一个有序数组为例来查找数字7
将最左边的元素下标记为left,将最右边的元素下标记为right。
首先可以查找最中间的元素,记为arr[mid],将它与k(即数字7)进行比较
若arr[mid] < k,则将 left 改为 mid + 1。
若arr[mid] > k,则将 right 改为 mid - 1。
若arr[mid] == k,循环结束。
else if (arr[mid] == k) {printf("找到了,该元素下标是:%d", mid);break;}
剩下的思路以此类推即可。
不难得出这可以用一个while循环来实现,那么while循环的条件是什么?
由上可知,left一直在增加,而right一直在减少,直到最终查找出元素即可,若left <=right且未查找出指定元素时,循环继续进行。
while循环如图所示
while (left<=right) {int mid = (left + right) / 2;if (arr[mid] < k) {left = mid + 1;}else if (arr[mid] > k) {right = mid - 1;}else if (arr[mid] == k) {break;}}
若left>right时,指定元素还未查找出来,则说明该数组不存在该元素。
if (left > right) {printf("对不起,没有找到该元素");}
整体代码如下:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int k = 7;int left = 0;int right = sz - 1;while (left<=right) {int mid = (left + right) / 2;if (arr[mid] < k) {left = mid + 1;}else if (arr[mid] > k) {right = mid - 1;}else if (arr[mid] == k) {printf("找到了,该元素下标是:%d\n", mid);break;}}if (left > right) {printf("对不起,没有找到该元素\n");}return 0;