C语言中的分而治之二分查找

Posted

技术标签:

【中文标题】C语言中的分而治之二分查找【英文标题】:divide and conque binary search in C 【发布时间】:2012-06-02 20:45:43 【问题描述】:

我正在尝试制作二进制搜索的分而治之版本,但是将数组分成两个子数组并进行搜索类似于合并排序中的合并,我想这样做的原因是因为我想在cilk,但我必须这样做。 这是我写的代码,它似乎有问题,因为它返回 -1 到有效的键值。

#include <stdio.h>
#include "BinarySearch.h"

int main () 
    int a[] = 0,1,2,3,4,5,6,7,8,9;
    int index = binarySearch(a, 0, 9, 7);
    printf("%i", index);

    return 0;


int binarySearch (int* A, int first, int last, int key) 
    if (last < first)
        return -1;
    else 
        int mid = (last + first) / 2;

        if (A[mid] == key)
            return mid;

        int x, y;
        x = binarySearch(A, first, mid - 1, key);
        y = binarySearch(A, mid + 1, last, key);

        if (x == -1 && y == -1)
            return -1;
        else if (x == -1 && y != -1)
            return y;
        else
            return x;
    

【问题讨论】:

好的,所以下一步是使用调试器(或大量打印语句)来跟踪程序的流程,以确定其行为与您预期的不同之处。 当您总是搜索两半时,这不是分而治之,如果密钥不存在,您将扫描整个数组。 向我们展示您的确切测试用例? 我不认为这是从编译的代码中复制的...... 【参考方案1】:

很简单,99 不存在于您的数组中。结果是正确的。您可能只是弄乱了参数-第一个是数组,接下来的两个代表搜索范围,第四个是您要查找的内容。正确的调用是:

int index = binarySearch(A, 0, 10, 4);

还有这个

int* A = &a[0];

没用,你可以简单地使用a作为数组衰减到指针:

int index = binarySearch(a, 0, 7, 99);  // a instead of A

另外 - 二分搜索 考虑了数组已排序的事实。如果您的密钥低于中间值,为什么还要向右搜索 - 保证您不会在那里找到它。

您正在做的是O(n),而不是O(log(n)) 二进制搜索解决方案。

【讨论】:

并非如此,右半部分的搜索有时会调用binarySearch(A,10,10,4); 看来是这个问题,传递的参数无效谢谢Luchian和大家【参考方案2】:

对于仍在寻找解决方案的任何人,I found this made by ankzcode

它在没有线性搜索的情况下使用分治法在数组中找到最小值。

#include <stdio.h>

int findMin(int a[], int l,int h)

    int pivot = (l + h) / 2;
    int minl=-1, minh = -1;

    if ( (pivot - l ) > 1) 
    
        minl = findMin(a, l, pivot);
    
    else 
    
        minl = (a[l] > a[pivot])?a[pivot]:a[l];
    
    if ( (h - pivot ) > 1) 
    
        minh = findMin(a, pivot, h);
    
    else 
    
        minh = (a[l] > a[pivot])?a[pivot]:a[l];
    

    return (minl>minh)?minh:minl;


int main()

    int a[]=5,2,9,10,3;
    printf("%d\n",findMin(a, 0, 5));
    return 0;

【讨论】:

欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案3】:

你给了键 99,它不在数组中,所以很明显代码返回 -1。

【讨论】:

以上是关于C语言中的分而治之二分查找的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 分治算法(二分查找算法递归实现)

C/C++ 分治算法(二分查找算法递归实现)

使用分而治之技术的二分查找

二分查找(折半查找)算法详解(C语言实现)

C语言二分查找算法,折半查找算法

C语言二分查找