Разделить и захватить бинарный поиск в C

Я пытаюсь создать бинарный поиск типа "разделяй и властвуй", но тот, который разделяет массив на два подмассива и выполняет поиск, похожий на слияние в сортировке слиянием, поэтому я хочу сделать это, потому что хочу использовать его в 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 ответа

Решение

Это просто, 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)) бинарное решение поиска.

Для тех, кто все еще ищет решения, я нашел это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;
}

Вы дали ключ 99, которого нет в массиве, поэтому очевидно, что код возврата -1.

Другие вопросы по тегам