一、前言
二分查找是最简单的查找算法了,他通过每次折半的方式,查找有序表中的元素,二分查找算法的使用条件其实比较苛刻,他查找的元素必须有序排列,就是采用顺序存储结构,我们使用一道简单的C语言题目来体会一下二分查找。
二、通过题目了解。
题目描述:
在某个有序数组中查找某个具体数字n。
输入描述:
无
输出描述:
找到了,下标为:6
或者,找不到
三、题目分析
这道题目我们需要先创建一个有序数组,我们可以通过二分查找来查找这个数组中的下标为6的元素。我们就创建数组为arr[] = {0,1,2,3,4,5,6,7,8,9,10}吧!
四、代码展示
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
//查找一个有序数组中的数字
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k=7;
int i = 0;
int sz = (sizeof(arr) / sizeof arr[0]);
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", mid);
break;
}
if (left > right)
{
printf("找不到");
}
}
return 0;
}
五、代码分析
首先我们定义一个数组,之后我们既然需要查找这个数组中的下标为6的元素,那么我们定义下标为6的元素为k,值为7,我们通过二分查找来找出7这个数字,在查找的过程中,我们发现自己需要知道数组中的元素个数来作为数组最右侧下标的值,这个时候我们使用sizeof操作符的运算,我们使用整个数组所占内存除上数组中第一个元素所占内存得到了数组中元素个数,在这里我们了解到我们需要的是数组的最右侧下标,但是数组下标是从0开始的,所以这里我们需要对计算出的数组元素个数减一得到数组最右侧下标。
得到左右数组下标之后我们需要中间下标来确定我们下一次的左侧下标或者右侧下标的位置,我们通过第一次左右侧下标的和除2得到我们中间下标mid,我们通过while循环来进行数组的二分查找,设置进入循环条件为left<=right意思是当左侧下标的位置小于右侧下标的位置时,进入循环。
进入循环之后我们对每次数组中间下标的元素arr[mid]的大小与k值进行比较,如果中间下标的元素比k小,那么这里就说明k是比我们中间下标的元素大的,这里我们就要对左侧下标进行更改,将mid+1的下标给左侧下标,如果中间元素比k大的话同理,但是这里注意我们对右侧下标采取的操作是mid-1,反复循环此操作直到找到k,也就是当arr[mid] = k的时候,我们就找到了我们应该找到的元素,break跳出循环,程序就结束了,输出找到了,元素下标为6。
如果当我们的k值在数组中没有的话,我们使用if语句,判断条件为left>right,当左侧下标比右侧下标大的时候,那这个数组中肯定没有你要找的元素了,这个时候我们就输出,找不到。