二分查找的几个用法

来源:互联网 发布:价格表制作软件 编辑:程序博客网 时间:2024/05/21 18:33
#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;}

原创粉丝点击