算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
二分法查找在针对大量有序排列的情况下发挥出很优越的效率,这里以最具规律性的数组为例,代码如下:
示例代码:
/* binarysearch2.c ---
*
* Filename: binarysearch2.c
* Description: 用循环方式和递归两种方式 实现二分法查找过程
* Author: magc
* Maintainer:
* Created: 三 7月 25 23:26:52 2012 (+0800)
* Version:
* Last-Updated: 四 7月 26 00:22:37 2012 (+0800)
* By: magc
* Update #: 74
* URL:
* Keywords: 递归 二分法查找
* Compatibility:
*
*/
/* Commentary:
*
*
*
*/
/* Change Log:
* 添加循环方式和递归方式
*
*/
/* Code: */
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
int binarysearch(int arr[],int len,int key);
int binarysearch2(int array[],int key,int low,int high);
int main(int argc, char * argv[])
{
int array[] = {3,5,6,7,11,22,44,47 };
int i;
printf("请参照下列数组,输入你要查找的目标:\n {");
int len = sizeof(array)/sizeof(int);
for (i = 0; i < len; i++) {
printf("%d,",array[i]);
}
printf("}:\n");
int dest;
scanf("%d",&dest);
int res = binarysearch(array,len,dest);
printf("1. res = %d\n",res);
int res2 = binarysearch2(array,dest,0,len - 1);
printf("2. res = %d\n",res2);
}
/**************************************************************************
函数名称:用循环实现二分法查找过程,
功能描述:
输入参数:
返 回:返回目标值在数组中的下标
**************************************************************************/
int binarysearch(int arr[],int len,int key)
{
int high,low;
high = len - 1;//假设数组是从小到大排列的
low = 0;
int midle = len/2;
while(high >= low)
{
midle = (high + low)/2;
if(arr[midle] == key)
return midle;
if(arr[midle] > key)
high = midle - 1; //前提是假设数组是从小到大排序,否则不确定是该加1还是减1
else if(arr[midle] < key )
low = midle + 1;
}
return (-1);
}
/**************************************************************************
函数名称:用递归实现二分法查找
功能描述:
输入参数:
返 回:
**************************************************************************/
int binarysearch2(int array[],int key,int low,int high)
{
if (low >= high)
return (-1);
int midle = (low + high)/2;
if(array[midle] == key)
return midle;
if(midle == high || midle == low) //此时,只剩下了下标为high和low的两个数,确定另一个数不是key后,就确定查找完毕,并且未找到目标值
{
if(array[high] == key)
return high;
else if(array[low] == key)
return low;
else
return (-1);
}
else if(array[midle] > key)
return binarysearch2(array,key,low,midle); //由于不确定排序方向,所以此处只能用midle值,而不能加1或减1
else if(array[midle] < key) //当中间值小于目标值时,在high的一侧继续查找,low变到midle位置上
return binarysearch2(array,key,midle,high);
}
/* binarysearch2.c ends here */
在GCC下编译运行结果如下:

注:
1)在第一个方法中,
要体会到二分法查找的思路,设置high和low参数的好处是,不论数组是从大到小还是从小到大排列,此函数皆适用。
注意把握此例中high和low的变更过程,特别是边界,当high和low相邻时,取到的midle值总是二者之一,若继续查找,便进入死循环状态,此时确定没有目标值,退出查找
3)理解递归的思路,凡可以递归的问题,一般用循环也能实现(反之不然),如binarysearch2方法。
在整理思路时,要准确把握变与不变因素,进而实现
来源:https://www.cnblogs.com/linux-sir/archive/2012/07/25/2608039.html