#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;
}
數組與二分查找
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.