Given a sorted array with possible duplicate elements
int first(int A[], int l, int r, int key)
{
if(r >= l)
{
int mid = (l + r)/2;
if( ( mid == 0 || key > A[mid-1]) && A[mid] == key)
return mid;
else if(key > A[mid])
return first(A, (mid + 1), r, key);
else
return first(A, l, (mid -1), key);
}
return -1;
}
int last(int A[], int l, int r, int key)
{
if(r – l >= 1)
{
int mid = (l + r)/2;
int n = sizeof(A)/sizeof(A[0]);
if(( mid == n-1 || key < A[mid+1]) && A[mid] == key )
return mid;
else if(key < A[mid])
return last(A, l, (mid -1), key);
else
return last(A, (mid + 1), r, key);
}
return -1;
}
int count(int A[], int key)
{
int i = first(A, 0, n-1, key);
int j = last(A, i, n-1, key);
return j-i+1; //gives number of occurences of 'key'
}