2016-03-08 51 views
1

我想做一個二進制搜索程序,我的代碼是在下面,但是當我給我偶數個元素時,它不會給出任何輸出當我給出奇怪的元素的程序工作很棒!如果是假的程序首先比較的中間值則比中間值爲什麼我的程序不工作,當我把一個偶數的元素

int main() 
{ 
    int n,a[50] ; 
    int i, j, temp,counter,searchv,f,l,mid; 
    cout<<"Enter no. of elements: "; 
    cin>>n; 
    f=0; 
    l=n-1; 
    mid=(f+l)/2; 
    cout<<"l= "<<l<<" mid= "<<mid<<"\n"; 
    cout<<"Enter "<<n <<" values \n"; 
    for(counter=0;counter<n;counter++) 
    { 
     cin>>a[counter]; 
    } 

    for(j=0; j<n; j++) 
    { 
     for (int i=(n-1); i>j ;i--) 
     { 
      if (a[i]<a[i-1]) 
      { 
       int temp=a[i-1]; 
       a[i-1]=a[i]; 
       a[i]=temp; 
      } 
     } 
    } 
    cout<<"SORTED ARRAY!!\n"; 
    for(counter=f;counter<n;counter++) 
    { 
     cout<<"Value at Element "<<counter <<" is "<<a[counter]; 

     cout<<endl; 
    } 
    cout<<"Enter number to search: "; 
    cin>>searchv; 

    if(a[mid]==searchv) 
    { 
     cout<<"searched value "<<searchv<<" founded at position "<<mid; 
    } 
    else if(searchv>a[mid]) 
    { 
     for(counter=l;counter>mid;counter--) 
     { 
      if(a[counter]==searchv) 
       cout<<"searched value "<<searchv<<" founded at position "<<counter; 
      break; 
     } 
    } 
    else if(searchv<a[mid]) 
    { 
     for(counter=0;counter<mid;counter++) 
     { 
      if(a[counter]==searchv) 
       cout<<"searched value "<<searchv<<" founded at position "<<counter; 
      break; 
     } 
    } 
    else 
    { 
     cout<<"Value not found\n"; 
    } 
    getch(); 
    return 0; 
} 
+0

這只是在一個二進制搜索一個半心半意的嘗試:您使用的事實是數組僅在頂層進行排序;之後,這是一個明確的線性搜索。而且你永遠不會報告失敗,因爲最後的'else'子句不應該被輸入。 –

+0

我意識到這可能是學術,但['std :: lower_bound'](http://en.cppreference.com/w/cpp/algorithm/lower_bound)可能會更方便(也更不容易出錯)。如果沒有其他內容,應該通過閱讀可能的實現說明來了解如何實現迭代二進制搜索算法。 – WhozCraig

回答

0

基於上面的回答,您可以添加此

,而不是

if(a[mid]==searchv) 
    { 
    cout<<"searched value "<<searchv<<" founded at position "<<mid; 
    } 
    else if(searchv>a[mid]) 
    { 
    for(counter=l;counter>mid;counter--) 
    { 
     if(a[counter]==searchv) 
    cout<<"searched value "<<searchv<<" founded at position "<<counter; 
    break; 
    } 
    } 
    else if(searchv<a[mid]) 
    { 
    for(counter=0;counter<mid;counter++) 
    { 
    if(a[counter]==searchv) 
    cout<<"searched value "<<searchv<<" founded at position "<<counter; 
    break; 
    } 
    } 

else 
{ 
    cout<<"Value not found\n"; 
} 

你可以試試這個:

bool isFound = false; 

    for(counter=0;counter<l;counter++) 
    { 
     if(a[counter]==searchv) 
     { 
      cout<<"searched value "<<searchv<<" founded at position "<< counter << endl; 
      isFound = true; 

     } 
    } 

    if (isFound == false) 
    { 
     cout << "No result found." << endl; 
    } 
+0

這就是gr8的工作 – user3828413

0

你的錯誤沒有任何與該陣列是否具有奇數或偶數元素小於或大於比較。在你的兩個線性搜索循環,例如:

for (counter = l; counter > mid; counter--) { 
     if (a[counter] == searchv) 
      cout << "searched value " << searchv << 
       " founded at position " << counter << '\n'; 
     break; 
    } 

break圈外無條件的。這意味着您只測試範圍的第一個元素。你想,如果你已經找到了一個匹配的,當然只有打破,所以你應該使用大括號:,

for (counter = l; counter > mid; counter--) { 
     if (a[counter] == searchv) { 
      cout << "searched value " << searchv << 
       " founded at position " << counter << '\n'; 
      break; 
     } 
    } 

這樣的錯誤更容易被發現,如果你讓一貫縮進的,並使用大括號的習慣,也許除非沒有else的最基本的if

通過此修復程序,您的程序將僅報告匹配項,但不會發生錯誤,因爲激活else在邏輯上可能永遠不會發生,因爲前三個掩碼涵蓋了所有可能的情況。 (對於整數,a == ba < ba > b覆蓋所有情況。)

您可以通過保持一個額外的變量,告訴你一個比賽是否已經發現或者通過重構搜索到一個單獨的功能,這是最好無論如何修復此。

+0

如果我在循環中將IF語句的其他部分放在「Value not found」中,它將起作用,但它會打印「Value not found」,直到循環結束 – user3828413

+0

您只能知道在您全部檢查完畢後未找到該值數組元素(或者在二進制搜索中,所有可能在邏輯上成爲值的元素)。這就是爲什麼打印「未找到」消息必須發生在最後,但它也必須利用信息是否已找到值。 –

+0

@M Oehm爲什麼我不能將我的程序稱爲二分查找? – user3828413

相關問題