递归二进制搜索/ C.

时间:2017-04-01 19:19:36

标签: c recursion binary-search

我一直在尝试使用递归(对我来说是一个新概念)来编写二进制搜索。我研究了很多并想出了这个:

int binary_search(int *parr, int value, int left, int right){
    int middle = (left+right)/2;
    if(*(parr+middle)==value){
        return 1;
    }
    if(right<left){
        return 0;
    }
    if(*(parr+middle)>value){
        return binary_search(*parr, value, left, middle-1);
    }
    else{
        return binary_search(*parr, value, middle+1, right);
    }
}

这是我的主要功能:

int main()
{
    int arr[maxbr],n, i, g;
    do{
        printf("\n n=");
        scanf("%d", &n);
    } while(n>maxbr);

    for(i=0; i<n; i++){
        printf("\n a[%d]", i);
        scanf("%d", &arr[i]);
    }

    g = binary_search(arr, 5, 0, n-1);
    printf(" %d", g);
}

由于某种原因,在我输入n和数组后崩溃了。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

你可能想要:

 return binary_search(parr, value, left, middle-1);

在parr面前没有* * parr是第一个int,parr是数组。

(另修一个)

答案 1 :(得分:0)

如果您愿意,可以尝试一下。

我实现了没有任何指针的递归二进制搜索,并确保检查了二进制搜索所需的所有条件。

关注我如何计算中间元素位置。

二进制搜索中的一个非常重要的条件是,应该对数组进行排序,并且始终将左索引设为<=右索引。

这是我的代码...

#include <stdio.h>

int binarySearch(int arr[],int x,int l,int m,int r){
    while (l<=r){
        if(arr[m] == x){
            return m+1;
        }
        else if(arr[m] > x){
            return binarySearch(arr,x,l,(l+(m-1))/2,m-1);
        }
        else if(arr[m] < x){
            return binarySearch(arr,x,m+1,((m+1)+r)/2,r);
        }
    }
    return -1;
}

int main(){
    int n,m,x;
    printf("Enter number of array elements: ");
    scanf("%d",&n);
    int l=0,r=n-1;

    if(r>=1){
        int arr[n],i,j;
        int temp=0,swapFlag=0;
        printf("\nInsert %d elements:\n",n);
        for(i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }
        printf("Insert complete.\n");

        printf("\nYour array looks like:\n");
        for(i=0;i<n;i++){
            printf("%d ",arr[i]);
        }

        //Remember binary search only works for sorted arrays.

        //Applying bubble sort to the array
        for(i=0;i<n-1;i++){
            swapFlag = 0;
            for(j=0;j<n-i-1;j++){
                if(arr[j]>arr[j+1]){
                    swapFlag = 1;
                    //Swapping unordered pairs
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            //Condition to reduce number of passes & comparisons
            if(swapFlag == 0){
                break;
            }
        }

        printf("\n\nAfter sorting the array looks like:\n");
        for(i=0;i<n;i++){
            printf("%d ",arr[i]);
        }

        printf("\n\nEnter an element that you want to find: ");
        scanf("%d",&x);

        m = (l+r)/2;
        int result = binarySearch(arr,x,l,m,r);

        if(result != -1){
            printf("\nYes! Element %d is found at position %d.",x,result);
        }
        else{
            printf("\nOops! Element %d is not found.",x);
        }
    }
    else{
        printf("Binary search is not required as array has only 1 element.");
    }
    return 0;
}

结果:-

enter image description here