一步一步复习数据结构和算法基础-索引顺序表查找

本文介绍了一种适用于分块有序数据的顺序索引表的实现方法,并提供了完整的C语言代码示例。该索引表能够高效地进行数据检索,通过将数据分成多个子表并记录每个子表的最大关键字,可以快速定位到目标元素所在的子表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//顺序索引表适合“分块有序”的情况
//从第一个子表的关键字开始,向后依次递增;
//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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值