【C语言】分块查找

原理:严蔚敏书P225、天勤P279

注意事项:要求被查找的表具备[分块有序]的特性,即第二个子表的所有关键字大于第一个子表的最大关键字。

代码:

#include <stdio.h>
#include <stdlib.h>
#define maxSize 100

typedef struct
{
	int key;
	int low, high;
}IndexElem;//采用天勤定义的数据结构


int IndexSearch(IndexElem index[], int m, int r[], int key)
{
	int low, high, mid, i;
	low = 0, high = m - 1;

	while (low <= high)
	{
		mid = (low + high) / 2;
		if (index[mid].key >= key)//注意这里是=,对比折半插入排序是不同的,因为此处相同表示就该在mid处查找,亦即high+1处查找
			high = mid - 1;
		else
			low = mid + 1;
	}

	i = index[high + 1].low;
	while (i <= index[high + 1].high)
	{
		if (r[i] == key)
			return i;
		i++;
	}

	return 0;
}



int main()
{
	int r[18] = { 22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53 };
	int n = 18;
	int m = 3, i, j, key = 12;

	//建立索引
	IndexElem index[maxSize] = { {22,0,5},{48,6,11},{86,12,17} };

	

	j = IndexSearch(index, m, r, key);

	if (j == 0)
		printf("Failure!");
	else
		printf("%d is %dth number", r[j], j + 1);

	system("pause");
	return 0;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值