用C语言实现二进制搜索排序数组

时间:2012-09-24 17:03:47

标签: c arrays search binary-search

我编写了以下程序来实现已排序数组的二进制搜索:

    int flag=0;

    void binarysearch(int x, int a[], int m, int n)
    {
        int middle=(m+n)/2;
        if(a[middle]==x)
        {
            printf("%d has been found at postion %d!\n", x, middle+1);
            flag=1;
        }
        else
        if(x > a[middle])
            binarysearch(x, a, middle, n);
        else
        if(x < a[middle])
            binarysearch(x, a, m, middle);
    }

    main()
    {
        int i, size, x;
        int a[100];
        printf("Enter the size of the list : ");
        scanf("%d", &size);
        printf("Enter the list items in ascending order : \n");
        for (i=0; i<size; i++)
        scanf("%d", &a[i]);
        printf("Enter the element to be found : ");
        scanf("%d", &x);
        binarysearch(x, a, 0, size-1);
        if(flag != 1)
        printf("%d has not been found in the list!", x);
    }

这个程序的问题是,如果试图搜索不在列表中的项目,函数binarysearch会一遍又一遍地递归调用自身。因此,flag变量变得毫无意义。

程序是否有可能告诉用户他是否正在尝试执行此类搜索(不在阵列中的某些内容)?

我假设它不可能,因为它是二进制搜索算法的基本缺陷。请赐教。

4 个答案:

答案 0 :(得分:8)

在开头检查m == n

if(m == n)
{
    if(a[n] == x) { printf("found\n"); }

    return;
}

如果没有x,您会继续使用middle == nmiddle == m给自己打电话。

答案 1 :(得分:2)

您的函数应使用返回值并返回在数组中找到它的索引

   int binarysearch(int x, int a[], int m, int n)
{
    int middle=(m+n)/2;
    if(a[middle]==x)
    {
        printf("%d has been found at postion %d!\n", x, middle+1);
        return middle;
    }
    else
    if(x > a[middle])
        return binarysearch(x, a, middle, n);
    else
    if(x < a[middle])
        return binarysearch(x, a, m, middle);

   //if it is not found in the whole array
   return -1;


}

答案 2 :(得分:1)

你需要一个简单的案例来打破递归,即n == m。如果这和x != a[middle]成立,则此元素不在数组中:

void binarysearch(int x, int a[], int m, int n)
    {
        int middle=(m+n)/2;
        if(n == m && x != a[middle])
        {
            printf("%d is not in the array", x);
            return;
        }
//...

或你的if else风格:

void binarysearch(int x, int a[], int m, int n)
    {
        int middle=(m+n)/2;
        if(n == m && x != a[middle])
        {
            printf("%d is not in the array", x);
        }
        else
        if(a[middle]==x)
//...

答案 3 :(得分:0)

我认为你对递归缺乏一些基本的了解。递归函数在到达其基本情况时应返回值。如果您知道我的意思,您的代码最终将导致“StackOverflow”:)