数据结构之二分查找
二分查找
简要记录:二分查找是一种非常容易想到的查找方法,我最早接触到的二分思想就是“一尺之捶,日取其半,万世不竭”,中学里寻找零点也是依靠的二分法,因此,掌握好二分查找对于学习提升很重要,这也是我在看到其他大佬的博客后对于学习的一些体会记录,也便于更好掌握二分查找。
二分查找的要求
- 查找序列要是有序的
- 只能查找单个元素
代码实现
#include<iostream>
using namespace std;
typedef int Elemtype;
//二分查找
int BinSerch(Elemtype arr[], int n, Elemtype data);
//int main()
//{
// Elemtype arr[10] = { 2,4,6,8,10,12,14,16,20,22 };
// for (int i = 0; i < 10; i++)
// cout << BinSerch(arr, 10, arr[i]) << endl;
// /*
// 打印:
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 一组供测试的数据
// */
// return 0;
//}
//
//二分查找
int BinSerch(Elemtype arr[], int n, Elemtype data)
{
int left = 0, right = n - 1; //定义左右哨兵
int mid = (right - left) / 2 + left;//定义二分的中间哨兵
/*
这里使用(right - left) / 2 + left 是为了防止 (right+left)/2 会溢出int类型
*/
while (left <= right) //二分循环的条件
{
mid = (right - left) / 2 + left;//每次循环都对中间哨兵更新
if (arr[mid] == data)
return mid; //找到对应值后返回对应下标
else if (arr[mid] > data) //查找的data小于中间哨兵对应的值,因此排除大于中间哨兵的值
right = mid - 1; //更新右哨兵,将右哨兵移动到中间哨兵左边一位
else //查找的data大于中间哨兵对应的值,因此排除小于中间哨兵的值
left = mid + 1; //更新左哨兵,将左哨兵移动到中间哨兵右边一位
}
return -1; //没有找到对应的data值,因此返回 -1
}