前言:
分治法-分而治之,就是把一个大问题分成若干个子问题逐一解决这些子问题,子问题的解合起来就是这个大问题的解。
二分查找就是从一个排好的序列中寻找目标数,若这个数存在则返回这个数的下标,若 不存在则返回-1。
算法描述:
举例一个排好序的序列{0,1,2,3,4,5,6}要从中查找4这个目标值。
left指向起始位置第一个数,right指向终点位置的数
先对半砍,找出中间位置mid的值与目标值targer比较。
如果中间值是目标值,则返回中间值的位置,
中间值>目标值,说明目标值在左半部分。右指向左移,right=mid-1;
中间值<目标值,说明目标值在右半部分。左指向右移,left=mid+1;
代码详细:
#include<stdio.h>
#include<iostream>
using namespace std;
int arr[] = { 0,1,2,3,4,5,6 };
//二分查找
int find(int* arr, int left, int right, int tager)
{
while (left <= right)//寻找到最后一个元素
{
int mid = (right + left) / 2;
if (arr[mid] == tager)
{
return mid;
}
if (tager > arr[mid])//左移
{
left = mid + 1;
}
if (tager < arr[mid])//右移
{
right = mid - 1;
}
}
return -1;
}
int main()
{
cout <<"目标值下标为:"<< find(arr, 0, 6, 4);
return 0;
}