数据结构-查找-分块查找

注:在分几块方面是分奇数偶数进行处理 

Description
编程实现分块查找。具体为,创建一个一维数组,指定该一维数组的大小n,输入数组的n个元素(该n个数据为递增),将该n个元素在逻辑上分为3块,并定义相应块的结构(每块数据的最大值,每块数据的起始地址,每块数据的结束地址)。输入要查找的数值kval,利用分块查找其关键字等于 kval 的数据元素,若找到,则函数值为该元素在表中的位置(1-n),否则为0,并输出结果。
具体例子:如数组{42,63,82,89,111,146,219,254,325,336,348,795,876,951,998}分3块后各个数据块的信息如下
key=111  ,start=0  ,end=4
key=336  ,start=5  ,end=9
key=998  ,start=10  ,end=14

此时如果查询219,则首先确定其在第2块内,然后在该块内顺序查找得到其位置。

Input 
仅有一组测试数据
第一行:输入一个整数n表示数组的长度(1<n<1000)
第二行:输入n个整数,整数之间用空格分隔
第三行:输入一个整数kval为要查找的数值

Output 
输出1个整数,为该元素在表中的位置

Sample Input
15
42 63 82 89 111 146 219 254 325 336 348 795 876 951 998
219

Sample Output

7

Hint
#include <bits/stdc++.h>
using namespace std;

typedef struct
{ // 可定义多种不同类型的数据类型
    int key;
} Elem;
typedef struct
{
    Elem *R; // 数组表基址一般下标为0不存值
    int len; // 长度
    Elem *index;
} Stable;

void initST(Stable &ST)
{ // 线性初始化
    ST.R = new Elem[1005];
    ST.index = new Elem[1005];
}
int dx;
void creat_ST(Stable &ST, int n)
{ // 创建线性数组
    ST.len = n;
    if (n % 3 == 0)
    {//根据奇数偶数分3块
        dx = n / 3;
    }
    else
    {
        dx = n / 3 + 1;
    }
    for (int i = 0; i < dx * 3; i++)
    {//初始化
        ST.R[i].key = 0;
    }
    for (int i = 0; i < ST.len; i++)
    {
        cin >> ST.R[i].key;
    }
    int max;
    for (int i = 0; i < 3; i++)
    {//查找每一块最大值并记录
        max = ST.R[i * dx].key;
        for (int j = i * dx + 1; j < dx * (i + 1); j++)
        {
            if (max < ST.R[j].key)
            {
                max = ST.R[j].key;
            }
        }
        ST.index[i].key = max;
    }
}

int serch_index(Stable ST, int k)
{//因题目要求三块比较少没有采用循环处理
    if (k <= ST.index[0].key)
    {//判断属于那一块进入块中查找
        for (int j = 0; j < dx; j++)
        {
            if (k == ST.R[j].key)
            {
                return j;
            }
        }
    }
    else if (k > ST.index[0].key && k <= ST.index[1].key)
    {
        for (int j = dx; j < dx * 2; j++)
        {
            if (k == ST.R[j].key)
            {
                return j;
            }
        }
    }
    else if (k > ST.index[1].key && k <= ST.index[2].key)
    {
        for (int j = dx * 2; j < dx * 3; j++)
        {
            if (k == ST.R[j].key)
            {
                return j;
            }
        }
    }
}
int main()
{
    Stable ST;
    initST(ST);
    int n, key, num;
    cin >> n;
    creat_ST(ST, n);
    cin >> key;
    num = serch_index(ST, key) + 1;
    cout << num;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值