一、概念
所谓的二分查找法,其实是一种有序的查找方法,也称折半查找(Binary Search),如果是无序的则要先进行排序操作。基本思想是:目标值通过与中间元素比较,可分为三种情况:
第一种情况:目标值与中间元素相等,查找结束;
第二种情况:目标值比中间元素大,则把后半部分的中间元素与目标值比较;
第二种情况:目标值比中间元素小,则把前半部分的中间元素与目标值比较;
这三步一直循环,直到查找结束。
二、编程思路
变量left指向有序数列的最左边的下标位置,变量right指向有序数列的最右边的下标位置,变量mid指向中间位置(left+right)/2.接着查找数据20跟中间值buf[mid]进行比较。
如果查找的数据比中间值小,那么查找的数据一定是在中间值的左边,所以更新最右边的下标值right = mid-1
如果查找的数据比中间值大,那么查找的数据一定是在中间值的右边,所以更新最左边的下标值left = mid+1
三、代码
#include <stdio.h>
/*
思路:变量left指向有序数列的最左边的下标位置,变量right指向有序数列的最右边的下标位置,变量mid指向中间位置(left+right)/2.接着查找数据20跟中间值buf[mid]进行比较。
如果查找的数据比中间值小,那么查找的数据一定是在中间值的左边,所以更新最右边的下标值right = mid-1
如果查找的数据比中间值大,那么查找的数据一定是在中间值的右边,所以更新最左边的下标值left = mid+1
*/
int binarySearch(int *buf,int findData,int length)
{
int left=0;
int right = length-1;
while(left<=right)
{
int mid = (left+right)/2;
if(findData<buf[mid])
{
right = mid-1;
}
else if(findData>buf[mid])
{
left = mid+1;
}
else
return buf[mid];
}
return -1;
}
int main()
{
int buf[10] = {1,2,3,4,5,6,7,8,9,10};
int length = sizeof(buf)/sizeof(buf[0]);
int ret = binarySearch(buf,1,length);
printf("ret:%d\n",ret);
return 0;
}