算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值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 */