2013-09-25 56 views
-3

雖然我試圖在二進制搜索遞歸函數中修改很少的代碼。該計劃表現怪異。有一段時間它會給出正確的值,並且有一段時間會進入無限循環。請解釋代碼出了什麼問題。我正在使用DEV C++作爲IDE。二進制搜索很少修改

CODE:

#include<iostream> 
#include<sstream> 
using namespace std; 

//function to compare the two integers 
int compare(int low, int high) 
{ 
    if (low==high) 
     return 0; 
    if (low<high) 
     return 1; 
    else 
     return -1; 
} 

//Function for binary search using recursion 
int *BinarySearch(int *Arr,int Val,int start,int end) 
{ 
    int localstart=start; 
    int localend=end; 
    int mid=(start+end)/3; 
    cout<<"MID:"<<mid; 
    int comp= compare(Val,Arr[mid]); 
    if(comp==0) 
     return &(Arr[mid]); 
    else if (comp>0) 
     return BinarySearch(Arr,Val,localstart,mid-1); 
    else 
     return BinarySearch(Arr,Val,mid+1,localend); 
    return NULL; 
} 

main() 
{ 
    int *arr; 
    arr= new int [256]; 
    string str; 
    getline(cin,str); 
    stringstream ss; 
    ss<<str; 
    int index=0; 
    while(ss>>arr[index]) 
     {index++;} 
    //cout<<arr[index-1]; 
    cout<<"Enter Value:"; 
    int value; 
    cin>>value; 
    int *final; 
    final=BinarySearch(arr,value,0,index-1); 
    if(final!=NULL) 
     cout<<"Final:"<<*final; 
    else 
     cout<<"Not Found"; 
    getchar(); 
    getchar(); 
    return 0; 
} 
+1

您在調試程序時發現了什麼? –

+0

缺乏縮進有點難以閱讀。 – Jamal

+1

「有一段時間它給出了正確的值,有一段時間它進入了無限循環」......兩種情況下的輸入值是什麼? – surender8388

回答

1

兩個想法:

  1. 我應該做的BinarySearch如果Val是不是數組中?跟蹤你的代碼在這種情況下做什麼。
  2. (start+end)/3可能不是當前範圍的中間值。
+0

你好,Nate,問題在於修改二進制搜索,以便它可以將問題分成1/3和2/3的子陣列,所以我不準確地搜索中間元素。對不起,縮進......此外,如果Val不在BinarySearch中,它將返回NULL,因爲其他條件在 –

+0

以上處理@AvikDas:你確定*如果找不到值,你的函數將返回NULL?手動做一個簡短的例子,假裝成電腦並遵循你的算法,看看你是否能夠到達你的功能的最後一行。 –