详解二分查找
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解二分查找相关的知识,希望对你有一定的参考价值。
引言
如何在一组递增数列中查找一个数,之前我们已经学习了顺序查找,就是按顺序一个个查找,但是当我们查找一个很大的数的时候,例如231(大约21亿)这时按顺序查找就会很繁琐,需要搜寻231次。有没有一种查找方式既快捷又简单呢?答案是有的,例如二分查找。二分查找又称折半查找,每一次查找都会排除一半的选项,这样大大减少了运算量。
具体思路
首先确定这组数据中间位置的数,把它和我们要找的数进行比较,如果相同那么这个数就找到了,如果不同就比较这两个数。若中间数大于要找的数就排除中间数右边的数据,并把所找的中间数当做末位,取它和首位的中间数与要找的数进行比较。若中间数小于要找的数就排除中间数左边的数据,并把所找的中间数当做首位,取它和末位的中间数与要找的数进行比较。重复上述操作直到找到为止。
代码实现
#include<stdio.h>
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,arr[%d]=%d\\n", mid,k);
break;
}
}
if (left>right)
{
printf("数组中没有这个数\\n");
}
return 0;
}
代码逐句分析
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
创建一个递增数组
int k = 0;
scanf("%d", &k);
输入要查找的数
int sz = sizeof(arr) / sizeof(arr[0]);
计算数组中元素个数`
int left = 0;
int right = sz - 1;
确定数组的首位和末位
while (left <= right)
确定循环条件,当满足左下标小于等于右下标时进入循环。
mid = (left + right) / 2;
找出中间数
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,arr[%d]=%d\\n", mid,k);
break;
}
}
对应上文二分查找的具体思路
if (left>right)
{
printf("数组中没有这个数\\n");
}
左下标大于右下标意味着数组中没有要找的数。
运行结果演示
分析与总结
二分查找可以很快得在递增数列中找到我们要找的数,但是它有很大的局限性。
上文演示了二分查找应用于递增数列,不难看出二分查找还可以应用与递减数列,这个留给大家去思考。
以上是关于详解二分查找的主要内容,如果未能解决你的问题,请参考以下文章