折半查找(二分查找)

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

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

关键字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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值