二分查找
适用范围:
适用于在已经排好序的数组中查找数值
二分查找,也称为折半查找,每次查找数值时,都取中间那个数值。
首先定义两个变量,一个为左边界,一个为右边界,左边界为数组下标最小的数0,右边界为数组下标最大的那个数,假设数组一共size个数,那么right = size-1(如下图)
int left = 0,right = size-1;
再定义一个mid代表中间值下标
int mid = left + (right-left)/2;
用一个循环结构来遍历数组,跳出循环条件为left>right,查找元素为data;
while(left <= right)
{
int mid = left + (right-left)/2;
if(data > arr[i])
{
left = mid + 1; //如果data > arr[i],左边界等于mid + 1;
}
if(data < arr[i])
{
right = mid - 1; //如果data < arr[i],右边界等于mid - 1;
}
if(data == arr[i])
{
break; //如果data == arr[i],跳出循环;
}
}
例题
Description
从键盘输入n个由小到大的整数,存放到数组a[1]~a[n]中。编写int BinSearch(int a[ ], int x)函数实现快速查找x的功能,如果查找成功,返回x所在数组元素的下标,否则失败返回0。
Input
输入n
输入n个由小到大的整数
输入要查找的x
Output
如果查找成功,返回元素所在的数组下标,否则失败返回0。
Sample Input
8
2 4 16 28 30 38 45 68
38
Sample Output
6
#include <stdio.h>
#include <stdlib.h>
int BinSearch(int *a, int x,int n)
{
int left = 0,right = n - 1;
int mid = 0;
while(left <= right)
{
mid = left + (right - left)/2;
if(a[mid]>x)
{
//如果下标为mid的元素大于要查找的数据,右边界就等于mid - 1;
right = mid - 1;
}
if(a[mid]<x)
{
//如果下标为mid的元素小于要查找的数据,左边界就等于mid + 1;
left = mid + 1;
}
if(a[mid] == x)
{
//如果相等,返回mid+1(因为题目中的数组从1开始,我们这是从0开始的,所以要加一)
return mid + 1;
}
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);//输入数组大小
int s[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&s[i]);//输入数组的数据
}
int x;
scanf("%d",&x);//输入要查找的数据
printf("%d",BinSearch(s,x,n));
return 0;
}