#include <stdio.h>
// Function to find first or last occurrence of a given number in
// sorted array of integers. If searchFirst is true, we return the
// first occurrence of the number else we return its last occurrence
int BinarySearch(int A[], int N, int x, int searchFirst)
{
// search space is A[low..high]
int low = 0, high = N - 1;
// initialize the result by -1
int result = -1;
// iterate till search space contains at-least one element
while (low <= high)
{
// find the mid value in the search space and
// compares it with target value
int mid = (low + high)/2;
// if target is found, update the result
if (x == A[mid])
{
result = mid;
// go on searching towards left (lower indices)
if (searchFirst)
high = mid - 1;
// go on searching towards right (higher indices)
else
low = mid + 1;
}
// if target is less than the mid element, discard right half
else if (x < A[mid])
high = mid - 1;
// if target is more than the mid element, discard left half
else
low = mid + 1;
}
// return the found index or -1 if the element is not found
return result;
}
// Count occurrences of a number in a sorted array with duplicates
int main(void)
{
int A[] = {2, 5, 5, 5, 6, 6, 8, 9, 9, 9};
int target = 5;
int n = sizeof(A)/sizeof(A[0]);
int first = BinarySearch(A, n, target, 1); // 1 for first occurrence
int last = BinarySearch(A, n, target, 0); // 0 for last occurrence
int count = last - first + 1;
if (first != -1)
printf("Element %d occurs %d times.", target
, count
); else
printf("Element not found in the array.");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBGdW5jdGlvbiB0byBmaW5kIGZpcnN0IG9yIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIG51bWJlciBpbgovLyBzb3J0ZWQgYXJyYXkgb2YgaW50ZWdlcnMuIElmIHNlYXJjaEZpcnN0IGlzIHRydWUsIHdlIHJldHVybiB0aGUKLy8gZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgbnVtYmVyIGVsc2Ugd2UgcmV0dXJuIGl0cyBsYXN0IG9jY3VycmVuY2UKaW50IEJpbmFyeVNlYXJjaChpbnQgQVtdLCBpbnQgTiwgaW50IHgsIGludCBzZWFyY2hGaXJzdCkKewogICAgLy8gc2VhcmNoIHNwYWNlIGlzIEFbbG93Li5oaWdoXQogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBOIC0gMTsKCiAgICAvLyBpbml0aWFsaXplIHRoZSByZXN1bHQgYnkgLTEKICAgIGludCByZXN1bHQgPSAtMTsKCiAgICAvLyBpdGVyYXRlIHRpbGwgc2VhcmNoIHNwYWNlIGNvbnRhaW5zIGF0LWxlYXN0IG9uZSBlbGVtZW50CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CiAgICAgICAgLy8gZmluZCB0aGUgbWlkIHZhbHVlIGluIHRoZSBzZWFyY2ggc3BhY2UgYW5kCiAgICAgICAgLy8gY29tcGFyZXMgaXQgd2l0aCB0YXJnZXQgdmFsdWUKICAgICAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpLzI7CgogICAgICAgIC8vIGlmIHRhcmdldCBpcyBmb3VuZCwgdXBkYXRlIHRoZSByZXN1bHQKICAgICAgICBpZiAoeCA9PSBBW21pZF0pCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQgPSBtaWQ7CgogICAgICAgICAgICAvLyBnbyBvbiBzZWFyY2hpbmcgdG93YXJkcyBsZWZ0IChsb3dlciBpbmRpY2VzKQogICAgICAgICAgICBpZiAoc2VhcmNoRmlyc3QpCiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKCiAgICAgICAgICAgIC8vIGdvIG9uIHNlYXJjaGluZyB0b3dhcmRzIHJpZ2h0IChoaWdoZXIgaW5kaWNlcykKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICB9CgogICAgICAgIC8vIGlmIHRhcmdldCBpcyBsZXNzIHRoYW4gdGhlIG1pZCBlbGVtZW50LCBkaXNjYXJkIHJpZ2h0IGhhbGYKICAgICAgICBlbHNlIGlmICh4IDwgQVttaWRdKQogICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKCiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIG1vcmUgdGhhbiB0aGUgbWlkIGVsZW1lbnQsIGRpc2NhcmQgbGVmdCBoYWxmCiAgICAgICAgZWxzZQogICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwogICAgfQoKICAgIC8vIHJldHVybiB0aGUgZm91bmQgaW5kZXggb3IgLTEgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGZvdW5kCiAgICByZXR1cm4gcmVzdWx0Owp9CgovLyBDb3VudCBvY2N1cnJlbmNlcyBvZiBhIG51bWJlciBpbiBhIHNvcnRlZCBhcnJheSB3aXRoIGR1cGxpY2F0ZXMKaW50IG1haW4odm9pZCkKewogICAgaW50IEFbXSA9IHsyLCA1LCA1LCA1LCA2LCA2LCA4LCA5LCA5LCA5fTsKICAgIGludCB0YXJnZXQgPSA1OwoKICAgIGludCBuID0gc2l6ZW9mKEEpL3NpemVvZihBWzBdKTsKICAgIGludCBmaXJzdCA9IEJpbmFyeVNlYXJjaChBLCBuLCB0YXJnZXQsIDEpOyAgLy8gMSBmb3IgZmlyc3Qgb2NjdXJyZW5jZQogICAgaW50IGxhc3QgPSBCaW5hcnlTZWFyY2goQSwgbiwgdGFyZ2V0LCAwKTsgICAvLyAwIGZvciBsYXN0IG9jY3VycmVuY2UKCiAgICBpbnQgY291bnQgPSBsYXN0IC0gZmlyc3QgKyAxOwoKICAgIGlmIChmaXJzdCAhPSAtMSkKICAgICAgICBwcmludGYoIkVsZW1lbnQgJWQgb2NjdXJzICVkIHRpbWVzLiIsIHRhcmdldCwgY291bnQpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiRWxlbWVudCBub3QgZm91bmQgaW4gdGhlIGFycmF5LiIpOwoKICAgIHJldHVybiAwOwp9