【问题标题】:Facing problems in binary search in c在c中面临二进制搜索的问题
【发布时间】:2022-01-05 12:20:21
【问题描述】:
#include <stdio.h>
int bsearch(int ar[],int n,int key)
{
    int s=0;
    int e=n-1;
    
    while(s<=e){
        int mid=(e+s)/2;
        if(mid==key){
            return mid;
        }
        else if(key<mid){
            e=mid-1;
        }
        else if(key>mid){
            s=mid+1;
        }
    }
    return -1;
}

我为二分查找做了函数

int main()
{
    int n,key;
    int ar[n];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        printf("ar[%d]= ",i);
        scanf("%d",&ar[i]);
        
    }
    printf("Enter key>> \n");
    scanf("%d",&key);
    printf("%d is the index",bsearch(ar,n,key));
    return 0;
}

然后我输入了一个排序后的数组,但有重复。如下图所示。

输出是 3 是索引。 但它应该是 6 是索引

【问题讨论】:

  • FIY:bsearch() 是标准定义的函数。无论您是#include &lt;stdlib.h&gt;,使用该标识符编写自己的函数都是一个坏主意。
  • key == mid 更改为 key == ar[mid] 因为 mid 是索引并且您正在寻找 ar[mid] 值。在计算mid 时,您应该查找溢出错误。你应该使用e + (e-s)/2(s+e) &gt;&gt; 1 而不是(e+s)/2。这将防止溢出错误。

标签: arrays c binary-search


【解决方案1】:

mid 是元素的索引,而不是值。所以,我已经更正了你的功能:

#include <stdio.h>
int bsearch(int ar[], int n, int key)
{
    int s=0;
    int e=n-1;
    
    while(s <= e){
        int mid = (e + s) / 2;
        if(key == ar[mid]) {
            return mid;
        }
        else if(key < ar[mid]) {
            e = mid-1;
        }
        else if(key > ar[mid]) {
            s = mid+1;
        }
    }
    return -1;
}

【讨论】:

  • 一致性(编程的一个非常重要的部分)表明条件if(ar[mid]==key) - else if(key&lt;ar[mid]) - else if(key&gt;ar[mid]) 应该都写成key first(或者可能都写成key last ,但这需要更多的关注)。
猜你喜欢
  • 2021-09-18
  • 2017-03-04
  • 2013-09-19
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多