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语言中的分而治之二分查找的主要内容,如果未能解决你的问题,请参考以下文章