大家都知道有许多排序方法和对应的查找方法,今天我就来介绍一个超级高效的查找方法:折半查找法(也叫二分法)。但是首先说明,这种方法只是用于顺序排列的数组(重点哈)。
折半查找法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]); //求出数组中元素的个数
int right = sz - 1; //设定一个数组右下标
int left = 0; //设定一个数组的左下标
printf("请输入你要查询的数字:>");
int input;
scanf("%d", &input);
while (left <= right) //只有在左下标 <= 右下标的时候才执行
{
int mid = (left + right) / 2; //这是折半查找法的核心,和定义一个中间数,将你要找的数和中间数相比较,然后进一步缩小范围
if (input < arr[mid])
{
right = mid - 1; //如果要找的数 < 中间数,则说明要找的数在刚刚划分区间的左边
}
else if (input > arr[mid])
{
left = mid + 1; //如果要找的数 > 中间数,则说明要找的数在刚刚划分区间的右边
}
else if(arr[mid] == input) //经过不断的缩小区间,最终找到该数字
{
printf("找到了,%d的下标为:> %d ", input, mid);
break;
}
}
if (left > right)
{
printf("没找到 %d 这个数字。", input);
}
return 0;
}
}
同理C++
C++版本(用函数实现)
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
typedef int Type;
int binary_search(int arr[], int len, Type input)
{
int left = 0;
int right = len - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
//int mid = (left + right) / 2; //避免int数据溢出
if (input > arr[mid])
{
left = mid + 1;
}
else if (input < arr[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
if (left > right)
return 0;
}
int main()
{
int arr[] = { 1,3,5,7,9,10,12,15,17 };
int sz = sizeof(arr) / sizeof(arr[0]);
cout << "请输入你要查找的数字:> " ;
Type input;
cin >> input;
int judge = binary_search(arr, sz,input);
if (judge)
{
cout << "找到" << input << "了" << "该下标为:> " << judge << endl;
}
else
{
cout << "未找到该数字" << endl;
}
return 0;
}
如果你在 2^32次方个数中找数,只需要32次就能找到,真是腻害。
最后强调虽然只能查找有序数组哦