折半查找法


一、折半查找使用范围:
(1)顺序存储结构    (2)按照关键字大小有序排列
二、基本思想:
将待查范围的中间元素的关键字key与给定的K值进行比较,结果又三种情况:
(1)k = key 查找成功
(2)k < key 待查元素在关键字为key的记录之前    利用关键字为key的位置将表分为前后两个部分,在前半部分子表进行查找
(3)k > key 待查元素在关键字为key的记录之前     在后半部分子表进行查找
三、实例:
有序顺序表关键字分别为 12 19 25 33 46 58 64 80  待查找记录的关键字为 46

r[0]   r[1]   r[2]   r[3]   r[4]   r[5]   r[6]    r[7]   r[8]
        12     19     25     33     46     58      64     80
        low                  mid                          high          mid = (low + high)/2     33 < 46  范围缩小到后半段   low = mid +1
                                    
                                    low    mid            high           58 > 46     范围缩小到前半段   high = mid -1

                                  low mid high                            46 = 46 查找成功

从上面我们可以看出,查找不成功的条件就是  low > high,也就是说 继续查找的循环控制条件是 low <= high

四、算法

int BinSearch(SeqRList L,KeyType K)
{
int low = 1,high = L.length,mid;
while(low <= high)
{
	mid = (low + high)/2;
	if(K = L.r[mid].key)
		return mid;
	else 
		if(K < L.r[mid].key)
			high = mid-1;
		else
			low = mid +1;
}
return 0;
}

五、优缺点:
优点:关键字的比较次数较少,查找速度快,平均性能较好
缺点:必须是有序表,而且还要基于顺序存储,这样插入删除比较困难。


你可能感兴趣的:(数据结构)