簡體   English   中英

用C語言實現二進制搜索排序數組

[英]Implementation of Binary Search of a Sorted Array in C

我編寫了以下程序來實現已排序數組的二進制搜索:

    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變量變得完全沒有意義。

是否有可能程序能夠告訴用戶他是否正在嘗試執行此類搜索(不在陣列中的某些內容)?

我假設它不可能,因為它是二進制搜索算法的基本缺陷。 請賜教。

檢查開頭的m == n

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

    return;
}

如果沒有x ,你繼續使用middle == nmiddle == m來稱呼自己。

您的函數應該使用返回值並返回在數組中找到它的索引

   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;


}

你需要一個簡單的案例來打破遞歸,即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)
//...

我認為你對遞歸缺乏一些基本的了解。 遞歸函數在到達其基本情況時應返回值。 如果你知道我的意思,你的代碼最終會導致“StackOverflow”:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM