分块查找代码解析

struct index {  //定义块的结构
    int key;
    int start;
} newIndex[3];   //定义结构体数组
  1. struct index { //定义块的结构:这里定义了一个名为index的结构体,该结构体包含两个成员变量keystart

  2. int key;:这是index结构体中的一个成员变量,用于表示块内元素的键值。

  3. int start;:这是index结构体中的另一个成员变量,用于表示块内元素的起始位置。

  4. newIndex[3];:这是一个结构体数组,名为newIndex,数组的长度为3。也就是说,该数组中可以存储3个index结构体的实例。

整体来看,这段代码定义了一个index结构体,用于表示分块查找中的块。然后,通过newIndex数组,创建了3个index结构体的实例,用于表示3个块。每一个index结构体的key成员变量用于存储块内元素的键值,start成员变量用于存储块内元素的起始位置。

int blockSearch(int key, int a[]) {
    int i, startValue;
    i = 0;
    while (i<3 && key>newIndex[i].key) { //确定在哪个块中,遍历每个块,确定key在哪个块中
        i++;
    }
    if (i >= 3) {  //大于分得的块数,则返回0
        return -1;
    }
    startValue = newIndex[i].start;  //startValue等于块范围的起始值
    while (startValue <= startValue + 5 && a[startValue] != key)
    {
        startValue++;
    }
    if (startValue > startValue + 5) {  //如果大于块范围的结束值,则说明没有要查找的数
        return -1;
    }
    return startValue;
  1. int blockSearch(int key, int a[]) {:这是一个函数定义,函数名为blockSearch,参数包括一个整型变量key和一个整型数组a[]。函数返回一个整型值。

  2. int i, startValue;:定义了两个整型变量istartValue,用于循环和记录起始值。

  3. i = 0;:将变量i初始化为0。

  4. while (i&lt;3 && key>newIndex[i].key) {:这是一个while循环,循环条件是i&lt;3(i小于3)且key>newIndex[i].key(key大于当前块的key值)。该循环用于确定key所在的块。

  5. i++;:每次循环结束后,将i自增1,继续判断下一个块。

  6. if (i >= 3) {:如果i大于等于3,说明没有找到合适的块来存储key,返回-1。

  7. startValue = newIndex[i].start;:将startValue的值设置为当前块的起始值。

  8. while (startValue &lt;= startValue + 5 && a[startValue] != key):这是一个while循环,循环条件是startValue &lt;= startValue + 5(startValue小于等于startValue + 5)且a[startValue] != key(当前位置的元素不等于要查找的key)。

  9. startValue++;:每次循环结束后,将startValue自增1,继续判断下一个元素。

  10. if (startValue > startValue + 5) {:如果startValue大于startValue + 5,说明在当前块内没有找到要查找的元素,返回-1。

  11. return startValue;:返回startValue,即找到要查找的元素在数组中的索引位置。

整体来看,这段代码实现了分块查找中块内元素的顺序查找。首先通过循环找到包含要查找元素的块,然后在该块的范围内进行顺序查找。如果找到了,返回元素在数组中的索引位置;如果没有找到,返回-1。

int cmp(const void* a, const void* b) {
    return (*(struct index*)a).key > (*(struct index*)b).key ? 1 : -1;
}//比较结构体的key值

这段代码是在每个块范围内遍历数组a,找到最大的元素值,并将其赋值给newIndex[i].key。这样做的目的是为了通过遍历整个数组来确定每个块的最大值,以便后续根据最大值来确定块的搜索范围。

代码中newIndex[i].key表示第i个块的最大值,a[k]表示数组a中的元素。通过比较newIndex[i].keya[k]的大小关系,如果a[k]newIndex[i].key大,则将其赋值给newIndex[i].key,即更新当前块的最大值。

这段代码的目的是为了找到每个块内的最大值,以便后续根据最大值来确定块的搜索范围。

qsort(newIndex, 3, sizeof(newIndex[0]), cmp);

这段代码使用qsort函数对newIndex数组进行排序,排序的范围是从索引0开始的3个元素。排序的依据是通过cmp函数进行比较。

qsort函数是C语言标准库中的一个排序函数,用于对数组进行快速排序。它接受以下参数:

  • 第一个参数是待排序的数组名称,即newIndex
  • 第二个参数是待排序元素的个数,这里是3个元素。
  • 第三个参数是每个元素的字节大小,即sizeof(newIndex[0])。这里是对newIndex[0]的大小进行计算,并将其作为排序单位。
  • 第四个参数是一个函数指针,指向一个函数,用于比较两个元素的大小。这里是cmp函数。
int main() {
    int i, j = -1, k, key;
    int a[] = { 33,42,44,38,24,48, 22,12,13,8,9,20,  60,58,74,49,86,53 };//待搜索的数组
    //确认模块的起始值和最大值
    for (i = 0; i < 3; i++) {
        newIndex[i].start = j + 1;  //确定每个块范围的起始值

在给定的代码片段中,j是一个局部变量。它只在for循环的作用域内定义和使用,并且每次循环迭代都会重新初始化为-1。因此,j的作用范围限于for循环的代码块中。

 
        j += 6;
        int k;
        for (k = newIndex[i].start; k <= j; k++) {
            if (newIndex[i].key < a[k]) {
                newIndex[i].key = a[k];
            }
        }
    }
    //对结构体按照 key 值进行排序
    qsort(newIndex, 3, sizeof(newIndex[0]), cmp);
    //输入要查询的数,并调用函数进行查找
    printf("请输入您想要查找的数:\n");
    scanf("%d", &key);
    k = blockSearch(key, a);
    //输出查找的结果
    if (k > 0) {
        printf("查找成功!您要找的数在数组中的位置是:%d\n", k + 1);
    }
    else {
        printf("查找失败!您要找的数不在数组中。\n");
    }
    return 0;
}
  1. int cmp(const void* a, const void* b):这是一个比较函数,用于对结构体进行比较。该函数的参数为两个const void指针类型的变量ab,函数返回一个整型值。比较的是结构体的key值。如果a的key值大于b的key值,返回1,否则返回-1。

  2. int main():主函数。

  3. int i, j = -1, k, key;:定义了四个整型变量ijkkey,其中j初始化为-1。

  4. int a[] = { 33,42,44,38,24,48, 22,12,13,8,9,20, 60,58,74,49,86,53 };:定义了一个整型数组a[],存储了待搜索的数组。

  5. for (i = 0; i &lt; 3; i++) {:这是一个for循环,循环次数为3,用于确定每个块的范围和最大值。

  6. newIndex[i].start = j + 1;:将当前块的起始值设置为j + 1

  7. j += 6;:将j的值增加6,即确定了当前块的结束值。

  8. int k;:定义了一个整型变量k用于循环。

  9. for (k = newIndex[i].start; k &lt;= j; k++) {:这是一个嵌套的for循环,循环次数为当前块的范围,用于在当前块中找到最大的值。

  10. if (newIndex[i].key &lt; a[k]) {:如果当前块的key值小于当前位置的值,则更新当前块的key值。

  11. newIndex[i].key = a[k];:将当前位置的值赋给当前块的key值。

  12. qsort(newIndex, 3, sizeof(newIndex[0]), cmp);:调用qsort函数对结构体数组newIndex进行排序,排序的依据是key值大小,使用了之前定义的比较函数cmp

  13. printf("请输入您想要查找的数:\n");:输出提示信息,要求用户输入要查找的数。

  14. scanf("%d", &key);:从用户输入中读取一个整数值,存储到变量key中。

  15. k = blockSearch(key, a);:调用blockSearch函数进行块内顺序查找,将查找结果赋值给变量k

  16. 根据查找结果输出对应的信息。

  17. return 0;:程序执行完毕,返回0表示正常结束.

部分代码解析

if (newIndex[i].key < a[k]) {
                newIndex[i].key = a[k];

这段代码是在每个块范围内遍历数组a,找到最大的元素值,并将其赋值给newIndex[i].key。这样做的目的是为了通过遍历整个数组来确定每个块的最大值,以便后续根据最大值来确定块的搜索范围。

代码中newIndex[i].key表示第i个块的最大值,a[k]表示数组a中的元素。通过比较newIndex[i].keya[k]的大小关系,如果a[k]newIndex[i].key大,则将其赋值给newIndex[i].key,即更新当前块的最大值。

这段代码的目的是为了找到每个块内的最大值,以便后续根据最大值来确定块的搜索范围。

newIndex[i].start = j + 1;

在这段代码中,newIndex[i].start表示newIndex数组中索引为i的元素的start成员。这里的start成员是一个整数值,用于存储某个位置(索引)的起始值。因此,newIndex[i].start = j + 1j+1赋值给newIndex[i]结构体的start成员。换句话说,它将newIndex[i]元素的start成员设置为j+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值