二分查找(Binary Search)
在计算机科学中,二分查找,也称为折半查找,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤之后可查找范围为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
1. 算法原理
-
设左右下标为LEFT和RIGHT,中间下标MID为左右下标和的一半
-
比较中间下标与要查找元素findnum的大小,确定二次查找的范围,在MID的左半区还是右半区
-
确定范围之后,调整左右下标的位置,以及中间下标的位置,重复上述过程
-
当左下标大于右下标时,也就是当左右下标中间不再存在可查找的数据时,循环结束返回-1;或者当找到需要查找的数据时,循环结束返回下标。
2. 算法实现
#include<stdio.h>
int BinarySearch(int* arr, int sz, int findnum)
{
int left = 0;//数组左下标
int right = sz - 1;//数组右下标
int mid = (left + right) / 2;//中间下标
int count = 0;
while (left <= right)//当左下标大于右下标的时候结束
{
count++;
mid = (left + right) / 2;
if (findnum > arr[mid])
{
left = mid+1;
}
else if (findnum < arr[mid])
{
right = mid - 1;
}
else
{
break;
}
}
if (left <= right)
{
printf("查找次数%d\n", count);
return mid;
}
else
{
return -1;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int findnum = 0;
printf("请输入你要查找的数字:");
scanf("%d", &findnum);
int ret = 0;
ret = BinarySearch(arr, sz, findnum);//找到返回下标,没有找到返回-1
if (ret == -1)
{
printf("没有找到!\n");
}
else
{
printf("找到了,下标为%d\n", ret);
}
return 0;
}
3. P2249
题目描述
输入n个不超过10^9的单调不减(单调不减:后面的数字不小于前面的数字,可以等于或者大于)的非负整数,然后进行m次询问。
对于每次询问,给出一个整数q,要求输出这个数字在序列中第一次出现的编号(下标+1),如果没有找到的话输出-1
输入格式:
第一行输入2个整数n和m,表示数字个数和询问次数
第二行n个整数,表示这些待查询的数字
第三行m个整数,表示询问这些数字的编号,从1开始编号
样例输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
样例输出
1 2 -1
实现
#include<stdio.h>
void BinarySearch(int* arr, int* finds, int n, int m)
{
int right = 0;
int left = n - 1;
int mid = 0;
int i = 0;
int j = 0;
for (i = 0; i < m; i++)
{
left = 0;
right = n-1;
while (left <= right)
{
mid = (left + right) / 2;
if (finds[i] > arr[mid])
{
left = mid + 1;
}
else if (finds[i] < arr[mid])
{
right = mid - 1;
}
else
{
break;
}
}
if (left <= right)
{
for (j = 0; j < n; j++)
{
if (arr[j] == finds[i])
{
printf("%d ", j + 1);
break;
}
}
}
else
{
printf("-1");
}
}
printf("\n");
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int finds[m];
int j = 0;
for (j = 0; j < m; j++)
{
scanf("%d", &finds[j]);
}
BinarySearch(arr, finds, n, m);
return 0;
}
scanf("%d", &arr[i]);
}
int finds[m];
int j = 0;
for (j = 0; j < m; j++)
{
scanf("%d", &finds[j]);
}
BinarySearch(arr, finds, n, m);
return 0;
}