2016-02-29 119 views
-5

我想在數組升序時使用二進制搜索算法搜索數組。我不知道爲什麼每次我搜索一個值時它說它不在數組中......這是我的代碼。二進制搜索升序排列C++

int main() 
{ 
    int found, value; 
    int array[] = {0,2,2,3,5,9,11,12,12,12,13,17,18,19,19,34}; // array to be searched 

    cout << "Enter an integer to search for:" << endl; 
    cin >> value; 

    found = binarySearch(array, SIZE, value); //function call to perform the binary search 
               //on array looking for an occurrence of value 
    if (found == -1) 
     cout << "The value " << value << " is not in the list" << endl; 
    else 
    { 
     cout << "The value " << value << " is in position number " 
      << found + 1 << " of the list" << endl; 
    } 
    system("pause"); 
    return 0; 
} 

//**********BINARY SEARCH********** 
int binarySearch(int array[],int numElems,int value) //function heading 
{ 
    int first = 0;     // First element of list 
    int last = numElems - 1;  // last element of the list 
    int middle;      // variable containing the current 
            // middle value of the list 

    while (first <= last) 
    { 
     middle = first + (last - first)/2; 

    if (array[middle] == value) 
     return middle;    // if value is in the middle, we are done 

    else if (array[middle] < value) 
     last = middle - 1;   // toss out the second remaining half of 
            // the array and search the first 
    else 
     first = middle + 1;  // toss out the first remaining half of 
            // the array and search the second 
    } 

    return -1;      // indicates that value is not in the array 
} 
+0

'std :: lower_bound'可能會有所幫助。 – Jarod42

+0

正如我在你的另一個問題上指出的那樣,在SO上不允許破壞問題甚至你自己的問題。訂閱者內容[在您發佈後由SO擁有](https://meta.stackoverflow.com/questions/336993/op-accepts-answer-then-vandalizes-the-question/)。 – azurefrog

回答

2

您的條件二進制搜索反轉。

if array[middle] < value然後你想在上半部分而不是下半部分搜索你的元素。

+0

謝謝!這工作!它總是那些小東西.... – user3408267

0

交易所last = middle - 1first = middle + 1和二進制搜索將正常工作。

讓搜索7

2 3 5 6 [7] 8 8 9

0 1 2 3 4 5 6 7

^f .... ^m ............ ^l

m = (7 + 0)/2 = 3

索引3的元素是6. 6 < 7。那麼我們應該將first更改爲mid + 1

如果中期值小於搜索值,那麼我們就應該改變first,所以搜索該值仍處於區間[first; last]