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