有关二分查找的详细讨论,请研究Jon Bentley的Programming Pearls。
下面是您的代码的测试工具,非常受Programming Pearls启发,还有一个代码版本。我做的唯一更改是在二进制搜索中添加(现在注释掉的)调试打印。从测试代码的输出几乎是完美的(线束说的一切经过,但它是不完全正确):
N = 0:
search for 0 in 0 entries - returned 0 found 0 PASS
N = 1: [0] = 1;
search for 0 in 1 entries - returned -1 PASS
search for 1 in 1 entries - returned 0 found 1 PASS
search for 2 in 1 entries - returned -1 PASS
N = 2: [0] = 1;[1] = 3;
search for 0 in 2 entries - returned -1 PASS
search for 1 in 2 entries - returned 0 found 1 PASS
search for 2 in 2 entries - returned -1 PASS
search for 3 in 2 entries - returned 1 found 3 PASS
search for 4 in 2 entries - returned -1 PASS
N = 3: [0] = 1;[1] = 3;[2] = 5;
search for 0 in 3 entries - returned -1 PASS
search for 1 in 3 entries - returned 0 found 1 PASS
search for 2 in 3 entries - returned -1 PASS
search for 3 in 3 entries - returned 1 found 3 PASS
search for 4 in 3 entries - returned -1 PASS
search for 5 in 3 entries - returned 2 found 5 PASS
search for 6 in 3 entries - returned -1 PASS
N = 4: [0] = 1;[1] = 3;[2] = 5;[3] = 7;
search for 0 in 4 entries - returned -1 PASS
search for 1 in 4 entries - returned 0 found 1 PASS
search for 2 in 4 entries - returned -1 PASS
search for 3 in 4 entries - returned 1 found 3 PASS
search for 4 in 4 entries - returned -1 PASS
search for 5 in 4 entries - returned 2 found 5 PASS
search for 6 in 4 entries - returned -1 PASS
search for 7 in 4 entries - returned 3 found 7 PASS
search for 8 in 4 entries - returned -1 PASS
N = 5: [0] = 1;[1] = 3;[2] = 5;[3] = 7;[4] = 9;
search for 0 in 5 entries - returned -1 PASS
search for 1 in 5 entries - returned 0 found 1 PASS
search for 2 in 5 entries - returned -1 PASS
search for 3 in 5 entries - returned 1 found 3 PASS
search for 4 in 5 entries - returned -1 PASS
search for 5 in 5 entries - returned 2 found 5 PASS
search for 6 in 5 entries - returned -1 PASS
search for 7 in 5 entries - returned 3 found 7 PASS
search for 8 in 5 entries - returned -1 PASS
search for 9 in 5 entries - returned 4 found 9 PASS
search for 10 in 5 entries - returned -1 PASS
N = 6: [0] = 1;[1] = 3;[2] = 5;[3] = 7;[4] = 9;[5] = 11;
search for 0 in 6 entries - returned -1 PASS
search for 1 in 6 entries - returned 0 found 1 PASS
search for 2 in 6 entries - returned -1 PASS
search for 3 in 6 entries - returned 1 found 3 PASS
search for 4 in 6 entries - returned -1 PASS
search for 5 in 6 entries - returned 2 found 5 PASS
search for 6 in 6 entries - returned -1 PASS
search for 7 in 6 entries - returned 3 found 7 PASS
search for 8 in 6 entries - returned -1 PASS
search for 9 in 6 entries - returned 4 found 9 PASS
search for 10 in 6 entries - returned -1 PASS
search for 11 in 6 entries - returned 5 found 11 PASS
search for 12 in 6 entries - returned -1 PASS
N = 7: [0] = 1;[1] = 3;[2] = 5;[3] = 7;[4] = 9;[5] = 11;[6] = 13;
search for 0 in 7 entries - returned -1 PASS
search for 1 in 7 entries - returned 0 found 1 PASS
search for 2 in 7 entries - returned -1 PASS
search for 3 in 7 entries - returned 1 found 3 PASS
search for 4 in 7 entries - returned -1 PASS
search for 5 in 7 entries - returned 2 found 5 PASS
search for 6 in 7 entries - returned -1 PASS
search for 7 in 7 entries - returned 3 found 7 PASS
search for 8 in 7 entries - returned -1 PASS
search for 9 in 7 entries - returned 4 found 9 PASS
search for 10 in 7 entries - returned -1 PASS
search for 11 in 7 entries - returned 5 found 11 PASS
search for 12 in 7 entries - returned -1 PASS
search for 13 in 7 entries - returned 6 found 13 PASS
search for 14 in 7 entries - returned -1 PASS
N = 8: [0] = 1;[1] = 3;[2] = 5;[3] = 7;[4] = 9;[5] = 11;[6] = 13;[7] = 15;
search for 0 in 8 entries - returned -1 PASS
search for 1 in 8 entries - returned 0 found 1 PASS
search for 2 in 8 entries - returned -1 PASS
search for 3 in 8 entries - returned 1 found 3 PASS
search for 4 in 8 entries - returned -1 PASS
search for 5 in 8 entries - returned 2 found 5 PASS
search for 6 in 8 entries - returned -1 PASS
search for 7 in 8 entries - returned 3 found 7 PASS
search for 8 in 8 entries - returned -1 PASS
search for 9 in 8 entries - returned 4 found 9 PASS
search for 10 in 8 entries - returned -1 PASS
search for 11 in 8 entries - returned 5 found 11 PASS
search for 12 in 8 entries - returned -1 PASS
search for 13 in 8 entries - returned 6 found 13 PASS
search for 14 in 8 entries - returned -1 PASS
search for 15 in 8 entries - returned 7 found 15 PASS
search for 16 in 8 entries - returned -1 PASS
N = 9: [0] = 1;[1] = 3;[2] = 5;[3] = 7;[4] = 9;[5] = 11;[6] = 13;[7] = 15;[8] = 17;
search for 0 in 9 entries - returned -1 PASS
search for 1 in 9 entries - returned 0 found 1 PASS
search for 2 in 9 entries - returned -1 PASS
search for 3 in 9 entries - returned 1 found 3 PASS
search for 4 in 9 entries - returned -1 PASS
search for 5 in 9 entries - returned 2 found 5 PASS
search for 6 in 9 entries - returned -1 PASS
search for 7 in 9 entries - returned 3 found 7 PASS
search for 8 in 9 entries - returned -1 PASS
search for 9 in 9 entries - returned 4 found 9 PASS
search for 10 in 9 entries - returned -1 PASS
search for 11 in 9 entries - returned 5 found 11 PASS
search for 12 in 9 entries - returned -1 PASS
search for 13 in 9 entries - returned 6 found 13 PASS
search for 14 in 9 entries - returned -1 PASS
search for 15 in 9 entries - returned 7 found 15 PASS
search for 16 in 9 entries - returned -1 PASS
search for 17 in 9 entries - returned 8 found 17 PASS
search for 18 in 9 entries - returned -1 PASS
几乎所有的是罚款;唯一的问题是最初的搜索,它应该失败,因为在空数组中没有值。
测试代码是:
#include <stdio.h>
int recurbinarysearch(int *oringalary, int low, int high, int target)
{
//printf("-->> %d..%d: ", low, high);
if (low > high)
{
//printf("<<-- %d ", -1);
return -1;
}
else
{
int mid = (low + high)/2;
if (target == * (oringalary + mid))
{
//printf("<<-- %d ", mid);
return mid;
}
if (target > * (oringalary + mid))
{
int r = recurbinarysearch(oringalary, mid + 1, high, target);
//printf("<<-- %d ", r);
return r;
}
if (target < * (oringalary + mid))
{
int r = recurbinarysearch(oringalary, low, mid - 1, target);
//printf("<<-- %d ", r);
return r;
}
}
}
int main(void)
{
for (int i = 0; i < 10; i++)
{
int a[i+1]; // No zero-size arrays in C
printf("N = %2d: ", i);
for (int j = 0; j < i; j++)
{
a[j] = 2 * j + 1;
printf("[%d] = %d;",j, a[j]);
}
putchar('\n');
for (int j = 0; j < 2*i+1; j++)
{
int f = recurbinarysearch(a, 0, i, j);
//putchar('\n'); // debug
printf("search for %2d in %2d entries - returned %2d",
j, i, f);
if (f >= 0 && f <= i)
{
printf(" found %2d", a[f]);
printf(" %s", (a[f] == j) ? "PASS" : "FAIL");
}
else
printf(" %8s %s", "", (j % 2 == 0) ? "PASS" : "FAIL");
putchar('\n');
}
}
return(0);
}
我要离开你的工作如何应对空数组情况。
您确定该数组已排序? – nhahtdh 2013-02-19 04:17:42
Yup几乎100%的数组被打印出来,它似乎被正确排序。 – SystemFun 2013-02-19 04:19:08
是否有可能是由于分割(低+高)/ 2导致的某种累积舍入误差? – 2013-02-19 04:22:36