c - 如何在c中的2个排序数据表上使用二进制搜索

标签 c search sorting binary-search

我正在研究如何在 C 语言中使用二进制搜索。

我将开始,

我有一个结构

struct keyval{
unsigned short key[2];
unsigned short val[2];
};

如您所见,这是一个包含 2 个短数组的结构,可以保存 2 个短值。

然后我将内存分配给这些结构。这使我能够在内存中存储许多此类结构。

struct keyval *codes1 = malloc(sizeof(struct keyval)*(0x1000000));
struct keyval *codes2 = malloc(sizeof(struct keyval)*(0x1000000));

我经历了一些循环并用 struct keyval 填充 code1。然后在另一个循环中,我还用 struct keyval 填充 code2

此数据将根据迭代键填充。所以基本上它会自动按键值排序。

然后我根据 val 值对我的数据进行排序。使用 c qsort 函数 和我自己的比较功能 如果一个 val 数组的位置 0 中的 short 小于另一个结构中相同位置的 short,则返回 -1 等等。

qsort(codes1,SIZE_OF_CODES1, sizeof(struct keyval), compare);
qsort(codes2,SIZE_OF_CODES2, sizeof(struct keyval), compare);

int compare(const void *a, const void *b){
    struct keyval *ia = (struct keyval *)a;
    struct keyval *ib = (struct keyval *)b;

    if(ia->val[0] > ib->val[0]){
        return 1;
    }else if (ia->val[0] < ib->val[0]){
        return -1;
    }else{
        return (ia->val[1] - ib->val[1]);
    }

现在这是我卡住的地方

我需要能够根据代码 2 中的值对代码 1 中的每个值进行二进制搜索。 当 codes1[i].val == codes2[i].val 我可以打印出 codes1[i].key 的值 然后是 codes2.[i].key

我的尝试是这样的

while(e <= SIZE_OF_CODES1){

    struct keyval *found = (struct keyval*) bsearch(&codes1[e],codes2,SIZE_OF_CODES2,sizeof(struct keyval),compare );

    if(found){
        printf("\n found key = %08x %04x value = %04x %04x", found -> key, found -> key[1],found->val[0],found ->val[1] );
    }

    e++;
}

上面的代码不会发现数据是否匹配,因为我确定代码中有匹配的地方

//添加编辑


刚刚调试了一下,我发现当bsearch调用比较函数时,每次调用它时,所有与ia关联的值都是零,但ib是正确的。

排序方式正确


有人能给我指出正确的方向来实现二分查找吗,我被困住了

我的旧比较函数

int compare(const void *a, const void *b){
struct keyval *ia = (struct keyval *)a;
struct keyval *ib = (struct keyval *)b;

if(ia->val[0] > ib->val[0]){

    return 1;
}else if(ia->val[0] < ib->val[0]){
    return -1;
}else{
    if(ia->val[1] > ib->val[1]){
        return 1;
    }else if(ia->val[1] < ib->val[1]){
        return -1;
    }else{
        return 0;
        }
}

最佳答案

要按照您的描述比较列表,逐步执行代码 1,然后对代码 1 中的每个条目在代码 2 上执行 bsearch()。您可以重复使用比较。我不确定 SIZE_OF_CODES1 和 2 是变量还是定义,我假设它们反射(reflect)了每个数组中元素的数量。

struct keyval *src=codes1;
struct keyval *dest=code2;
struct keyval *p
int i=0;
while(i< SIZE_OF_CODES1)
{
    if( (p=(struct keyval *)bsearch(src, dest, SIZE_OF_CODES2, sizeof(struct keyval), compare))!=NULL)
        printf("duplicate codes1: %d %d  codes2: %d %d\n", src->key,src->val, p->key, p->val);
    i++
}

关于c - 如何在c中的2个排序数据表上使用二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390718/

相关文章:

excel - Excel VBA查找重复项并发布到其他工作表

c - C 中的字符串分词器

c - 在 C 中填充动态结构数组

c - 我需要使用非标准编译库中的函数

java - 链表排序插入

sorting - Firebase 3.0 按值排序

C - 使用 getchar 读入 float 值并使用 printf 打印出 float

algorithm - 搜索/排序算法 - 是否有类似 GoF 的列表?

php - 搜索引擎只能单返回?

search - 使用 elasticsearch 索引 Mysql 数据库