//顺序索引表适合“分块有序”的情况
//从第一个子表的关键字开始,向后依次递增;
//22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53 101 33
//以6为分块
//每个子表的最大数字为 22 48 86 101 即分块递增
#include<stdio.h>
#include<stdlib.h>
#define N 10
#define MAX -1
//索引表的数据结构
typedef struct dic
{
int max_number;
int begin,end;
}dic;
dic list[N];
//索引表创建--6为分割点
int divide(int digit[],int n)
{
int i=1,k,j=1,tmp=n;
int max;
while(n>0)
{
k=i+5;
max = MAX;
if(n<6)
{
list[j].begin = i;
for(;i<=tmp;i++)
if(digit[i] > max)max = digit[i];
list[j].end = tmp;
}
else
{
list[j].begin = i;
for(;i<=k;i++)
if(digit[i] > max)max = digit[i];
list[j].end = k;
}
list[j].max_number = max;j++;
n-=6; //每次截取长度为6的数组
}
return j-1;
}
int Search(int *digit,int k,int count)
{
int i,pos;
for(i=1;i<=count;i++)
{
if(list[i].max_number == k)
return list[i].begin;
if(list[i].max_number > k)
break;
}
for(pos=list[i].begin;pos<=list[i].end;pos++)
if(digit[pos] == k)return pos;
return -1;
}
int main()
{
int *digit;
int pos,n,i,k,count;
scanf("%d",&n);
digit = (int*)malloc(sizeof(int)*(n+1));
for(i=1;i<=n;i++)
scanf("%d",digit+i);
count = divide(digit,n);
scanf("%d",&k);
if((pos = Search(digit,k,count))!=-1)
printf("the position of the number is %d\n",pos);
else
printf("the number you want to search does not exist.\n");
return 0;
}
一步一步复习数据结构和算法基础-索引顺序表查找
最新推荐文章于 2024-12-05 14:47:15 发布