二进制搜索升序命令数组C ++

时间:2016-02-29 22:04:50

标签: c++ arrays

当数组按升序排列时,我尝试使用二进制搜索算法搜索数组。我不知道为什么每次我搜索一个值,它说它不在数组中......这是我的代码。

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
}

2 个答案:

答案 0 :(得分:2)

二进制搜索的条件被反转。

如果array[middle] < value那么你想在上半部而不是下半部搜索你的元素。

答案 1 :(得分: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]区间