索引顺序查找(分块查找)算法
算法分析:
将n个数据元素按块有序的划分为m块(m不能大于n)。每一块的元素可以不是有序的,但块与块之间必须有序,第一块中的任一元素的关键字都必须小于第二块任一元素的关键字,第二块中的任一元素都要小于第三块中的任一元素······
具体操作:
1>先去各块的最大关键字构成索引表。
2>查找分为两部分,先对索引表进行二分查找或顺序查找,已确定待查记录在哪一块中。
3>然后,在已经确实的块中用顺序法进行查找。注意这里的这一步只能用顺序法。
- 代码
#include<stdio.h>
struct index
{
int key;
int start;
int end;
}index[4];
int main()
{
int search(int key, int a[]);
int i, j = -1, k, key;
int a[] = {42,63,82,89,111,146,219,254,325,336,348,795,876,951,998};
printf("已知有一组数:\n");
for(i = 0; i<15; i++)
printf("%d,",a[i]);
printf("\n");
for(i = 0; i < 3;i++)
{
index[i].start = j + 1;
j += 1;
index[i].end = j + 4;
j += 4;
index[i].key = a[j];
}
printf("Enter the number that need to search:\n");
scanf("%d", &key);
k = search(key, a);
if(k >= 0)
printf("The number %d is the %d element in the array\n",key, k+ 1);
else
printf("Don't search the number\n");
}
int search(int key, int a[])
{
int i, j;
i = 0;
while(i < 3 && key > index[i].key)
i++;
if(i >= 3)
return -1;
j = index[i].start;
while(j <= index[i].end && a[j] != key)
j++;
if(j > index[i].end)
j = -1;
return j;
}