我的二进制搜索有什么不对吗?

时间:2013-04-08 17:58:32

标签: c++ search binary

这是我尝试实现二进制搜索方法以在20的数组中查找任意整数X并输出它在数组中出现的次数。

我的输出似乎是错误的,因为它输出1无论给定整数出​​现在数组中多少次。

有人可以帮助我并告诉我我的代码有什么问题吗? (我知道20非常小,线性方法实现起来会更简单,但我用20来简化事情)

为了确定,我正在输入imin = 0和imax = 19的输入 我也确定我已经对数组进行了排序。

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;
int A[20] = {0};
int x;
int imin;
int imax;

int BinarySearch(int A[], int value, int low, int high, int count) {
       if (high < low){          
           return -1; // not found
       } 
       int mid = low + ((high - low) / 2); 

       if (A[mid] > value){
       cout<< A[mid] << " > " << value <<endl; 
           return BinarySearch(A, value, low, mid-1, count);
       }
       else if (A[mid] < value){
      cout<< A[mid] << " < " << value <<endl; 
           return BinarySearch(A, value, mid+1, high, count);
       }
       if (A[mid] == value){
       cout<< A[mid] << " = " << value <<endl; 
       count = count + 1;
       }

      return count;

   }

int main(){


    cout<<"Enter 20 integers"<<endl;

    for (int i = 0; i < 20;i++){
    cin>>A[i];
    }


    cout<<"Enter the integer x"<<endl;
    cin>>x;

    cout<<"What is imin?"<<endl;
    cin>>imin;

    cout<<"What is imax?"<<endl;
    cin>>imax;


int temp;
int i;    

for (int j = 1; j < 20; j++){
    i = j - 1;        
    temp = A[j]; 

    while ((i>=0) && (A[i] > temp) ) 
    {  
       A[i+1] = A[i];
       i=i-1;                                                  
    }


    A[i+1] = temp; 


 }


 int count = BinarySearch(A, x, imin, imax, 0);

cout<<count<<endl;

     system("pause");

}

非常感谢

编辑:添加了一些更正。但我认为二进制搜索算法似乎有些问题!

3 个答案:

答案 0 :(得分:2)

int A[] = {0};更改为

int* A=new int[20]; 

int A[20]={0} 目前你不是为20个整数分配内存,而是为1分配内存。

同时将你的ifs改为涵盖{}

中的指令组
if(){
    //... many instructions
}else{
    //... many instructions
}

答案 1 :(得分:1)

您必须使用{}来制作if语句

if (A[mid] > value) {
                    ^^
   cout<< A[mid] << " > " << value <<endl; 
   return BinarySearch(A, value, low, mid-1, count);
}
^^
else if (A[mid] < value) {
    cout<< A[mid] << " < " << value <<endl; 
    return BinarySearch(A, value, mid+1, high, count);
}

正如写的那样现在写二进制搜索永远不会到达

 if (A[mid] == value){
   cout<< A[mid] << " = " << value <<endl; 
   count = count + 1;
   }

它将始终返回

if (high < low)            
       return -1; // not found

OR

 return BinarySearch(A, value, low, mid-1, count);

正如评论中所建议的那样

int A[] = {0};

应该是

int A[20];

还有一件事你必须接受从binarysearch返回的内容

int count = BinarySearch(A, x, imin, imax, 0);
cout<<count<<endl;
system("pause");

再确定一次。

   if (A[mid] == value){
        cout<< A[mid] << " = " << value <<endl; 
        count = count + 1;        // increment count
        count = BinarySearch(A, value, mid+1, high, count);  // search one side to find additional "value"
        return BinarySearch(A, value, mid, high - 1, count); // search the other side to find additional "value"
    }

答案 2 :(得分:1)

您的代码中存在一些基本错误:

代码问题:

  else if (A[mid] < value){
       cout<< A[mid] << " < " << value <<endl; 
       return BinarySearch(A, value, mid+1, high, count);
   }
   if (A[mid] == value){  
   //^^^^another else is missing
        cout<< A[mid] << " = " << value <<endl; 
        count = count + 1;
   }

与此同时,您尝试使用二分查找来查找给定数字的出现的方式并不完全正确。它应该按如下方式完成:

因为您已经使用插入排序对数组进行了排序。你需要做的是简单地使用二进制搜索来找到给定整数的第一个和最后一个出现,然后出现的总数是这两个索引之间的简单算术。

例如,给定数组(已排序)如下:

 1 2 3 4 4 4 4 4 5 5 5

你想找到4,然后你用二分搜索找到第一个出现在索引3,最后出现在索引7,出现的总数则是7-3 + 1 = 5.

主要代码应如下所示:

int findFrequency(int A[], int x, int n)
{
    int firstIndex = findFirst(A, 0, n-1, x, n);

    if(firstIndex  == -1)
        return firstIndex;

    //only search from firstIndex to end of array
    int lastIndex = findLast(A, firstIndex, n-1, x, n);

    return (lastIndex - firstIndex + 1);
}

 int findFirst(int A[], int low, int high, int x, int n)
 {
    if(high >= low)
    {
        int mid = low + (high - low)/2;
        if( ( mid == 0 || x > A[mid-1]) && A[mid] == x)
            return mid;
        else if(x > A[mid])
           return findFirst(arr, (mid + 1), high, x, n);
       else
           return findFirst(A, low, (mid -1), x, n);
    }
    return -1;
  }


  int findLast(int A[], int low, int high, int x, int n)
  {
      if(high >= low)
      {
          int mid = low + (high - low)/2;
          if( ( mid == n-1 || x < A[mid+1]) && A[mid] == x )
             return mid;
          else if(x < A[mid])
             return findLast(A, low, (mid -1), x, n);
          else
             return findLast(A, (mid + 1), high, x, n);      
      }
      return -1;
  }