分块查找法

分块查找也称为索引顺序查找,要求将待查的元素均匀地分成块,块间按大小排序,块内不排序,所以要建立一个块的最大(或最小)关键字表,称为索引表。

必须满足分在第一块中的任意数都小于第二块中的所有数,第二块中的所有数都小于第三块中的所有数,......。

 

// 索引表结构体:存储块最大元素和起始下标

typedef struct {

    int max; // 块内最大元素

    int start; // 块起始下标

} Index;

 

// 分块查找函数

int blockSearch(int arr[], Index indexTable[], int n, int target) {

    // 1. 在索引表中查找目标所在块(顺序查找示例)

    int block;

    for (block = 0; block < MAX_BLOCK; block++) {

        if (target <= indexTable[block].max) {

            break;

        }

    }

    // 块越界或块内无元素

    if (block >= MAX_BLOCK || indexTable[block].start >= n) {

        return -1;

    }

    

    // 2. 在对应块内顺序查找

    int start = indexTable[block].start;

    int end = (block == MAX_BLOCK - 1) ? n : start + BLOCK_SIZE;

    for (int i = start; i < end; i++) {

        if (arr[i] == target) {

            return i; // 返回下标

        }

    }

    return -1; // 未找到

}

你可能感兴趣的:(c语言)