#include<iostream>
using namespace std;
bool binary_search(int *a, int n, int x)
{
int left = 0, right = n-1;
int mid;
while( left <= right )
{
int mid = left + (right - left) / 2;
if( a[mid] == x )
{
return true;
}
else if( a[mid] < x )
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return false;
}
int findMaxIndexEqual(int* a, int n, int x)
{
int left = 0;
int right = n-1;
int mid ;
while( left < right-1)
{
mid = left + (right - left)/2;
if( a[mid] == x )
{
left = mid;
}
else if( a[mid] > x )
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return a[right] == x? right:(a[left] == x?left:-1);
}
int findMaxIndexLess(int* a, int n, int x)
{
int left = 0;
int right = n-1;
int mid;
while( left < right - 1 )
{
int mid = left + (right - left) / 2;
if( a[mid] < x )
{
left = mid;
}
else
{
right = mid - 1;
}
}
return x > a[right]? right:(x > a[left]? left : -1);
}
int findMinIndexEqual(int* a, int n, int x)
{
int left = 0;
int right = n-1;
int mid;
while( left < right )
{
mid = left + (right-left)/2;
if( a[mid] == x )
{
right = mid;
}
else if( a[mid] > x )
{
right = mid-1;
}
else
{
left = mid+1;
}
}
return a[left] == x? left: -1;
}
int findMinIndexGreater(int* a, int n, int x)
{
int left = 0;
int right = n-1;
int mid;
while( left < right )
{
mid = left + (right - left) / 2;
if( a[mid] > x )
{
right = mid;
}
else
{
left = mid + 1;
}
}
return a[left] > x ? left: -1;
}
int main(int argc, char *argv[])
{
int a[] = {1,1,2,2,2,2,4, 5, 6, 6};
cout << binary_search(a, 10, 3) << endl;
cout << findMaxIndexEqual(a,10, 2 ) << endl;
cout << findMinIndexEqual(a,10, 2 ) << endl;
cout << findMaxIndexLess(a,10, 2 ) << endl;
cout << findMinIndexGreater(a,10, 2 ) << endl;
return 0;
}
二分查找的几个用法
最新推荐文章于 2022-10-05 11:17:35 发布