首页 > 代码库 > 折半查找(二分查找)

折半查找(二分查找)

折半查找:先确定待查找记录所在的范围(区间),然后逐步缩小范围知道找到或找不到该记录为止。

折半查找过程:以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或查找区间的大小小于零时(表明查找不成功)为止。

关键字key与表中某一元素array[i]比较,有3中情况:

1. key == array[i], 查找成功

2.key > array[i], 待查找元素可能的范围是array[i]之前

3.key < array[i], 待查找元素可能的范围是array[i]之后

优点:

1、折半查找的效率比顺序查找要高。

2、折半查找的时间复杂度为log2(n)

3、折半查找的平均查找长度为log2(n+1) - 1

缺点:

1、折半查找只适用于有序表

2、折半查找限于顺序存储结构,对线性链表无法有效地进行折半查找

适用范围:对于规模较大的有序表查找,效率较高。适合很少改动但经常查找的表。

示例(binary.c):

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
#define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define LQ(a, b) ((a) <= (b))

int Search_Bin(ElemType array[], int num, int length)
{
	int index_low, index_mid, index_high;
	index_low = 1; 
	index_high = length;
	while(index_low <= index_high){
		index_mid = (index_low + index_high) / 2;	
		if(EQ(num, array[index_mid])) return index_mid + 1;
		else if(LT(num , array[index_mid])) index_high = index_mid - 1;
		else index_low = index_mid + 1;
	}
	return -1;
}

int
main(void)
{
	ElemType array[] = {5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92};
	int length = sizeof(array)/sizeof(ElemType);
	int index = Search_Bin(array, 19, length);
	if(index == -1){
		printf("search failed.\n");
	}else{
		printf("the number 19‘s location is %d.\n", index);
	}
	return 0;

}

编译:gcc binary.c

运行:./a.out

结果显示:the number 19‘s location is 3.