原理:严蔚敏书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;
}