數組與二分查找

#include <iostream>
#include <cstdio>

using namespace std;

int binary_serach(int [], int , int );
int lower_bound(int [], int , int );
int upper_bound(int [], int , int );
int find_miss_NO(int [], int);


int main()
{
    /*
    給定有序整數數組a[]和整數x,返回x在數組a[]中出現次數
    【解題思路】
    兩次二分查找,分別求出upper_bound(x)和lower_bound(x),返回兩者之差即可
    */
    int a[10] = {1, 2, 3, 4, 4, 4, 5, 6, 6, 7};
    cout << upper_bound(a, 10, 4) - lower_bound(a, 10, 4) << endl;


    /*
    一個sorted interger Array[1...N], 已知範圍 1...N+1. 已知一個數字missing。 找該數字。比如
    Array[]={1, 2, 3, 5, 6},則missing的數爲4。
    【解題思路】
    典型的二分查找,如果Array[i]=i,則向右查找,否則向左查找。如果採用C++實現,由於下標從0開始,則需作適當修改。
    */
    int b[] = {1, 2, 3, 4, 6};
    cout << find_miss_NO(b, 5) << endl;

    return 0;
}

int binary_serach(int a[], int n, int x)
{//找到x在a[]中的位置,不存在返回-1
    int low = 0, high = n - 1, mid;
    while(high >= low)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] == x)
            return mid;
        else if(a[mid] < x)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

int lower_bound(int a[], int n ,int x)
{//lower_bound,即下界,找到大於等於x的第一個元素
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] >= x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}

int upper_bound(int a[], int n, int x)
{//upper_bound, 上界,找到大於x的第一個元素
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] > x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}

int find_miss_NO(int a[], int n)
{
    /*
    一個sorted interger Array[1...N], 已知範圍 1...N+1. 已知一個數字missing。 找該數字。比如
    Array[]={1, 2, 3, 5, 6},則missing的數爲4。
    【解題思路】
    典型的二分查找,如果Array[i]=i,則向右查找,否則向左查找。如果採用C++實現,由於下標從0開始,則需作適當修改。
    */
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);
        if(a[mid - 1] == mid)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return low;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章