在C中划分和征服二进制搜索

时间:2012-05-28 13:24:19

标签: c recursion binary-search divide-and-conquer

我正试图划分和征服二进制搜索版本,但是将数组划分为两个子阵列并且搜索类似于合并排序中的合并,我之所以要这样做是因为我想在其中使用它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;
    }
}

3 个答案:

答案 0 :(得分:3)

很简单,你的数组中不存在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))二进制搜索解决方案。

答案 1 :(得分:1)

对于任何仍在寻找解决方案的人,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;
}

答案 2 :(得分:0)

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