#include <stdio.h>
// Function to find an element x in a circularly sorted array
int circularArraySearch(int A[], int n, int x)
{
// search space is A[low..high]
int low = 0, high = n - 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, return its index
if (x == A[mid])
return mid;
// if right half (A[mid..high]) is sorted and mid is not
// the target element
if (A[mid] <= A[high])
{
// compare target with A[mid] and A[high] to know
// if it lies in A[mid..high] or not
if (x > A[mid] && x <= A[high])
low = mid + 1; // go searching in right sorted half
else
high = mid - 1; // go searching left
}
// if left half (A[low..mid]) is sorted and mid is not
// the target element
else
{
// compare target with A[low] and A[mid] to know
// if it lies in A[low..mid] or not
if (x >= A[low] && x < A[mid])
high = mid - 1; // go searching in left sorted half
else
low = mid + 1; // go searching right
}
}
// target not found or invalid input
return -1;
}
// main function
int main(void)
{
int A[] = {9, 10, 2, 5, 6, 8};
int target = 5;
int n = sizeof(A)/sizeof(A[0]);
int index = circularArraySearch(A, n, target);
if (index != -1)
printf("Element found at index %d", index
); else
printf("Element not found in the array");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBGdW5jdGlvbiB0byBmaW5kIGFuIGVsZW1lbnQgeCBpbiBhIGNpcmN1bGFybHkgc29ydGVkIGFycmF5CmludCBjaXJjdWxhckFycmF5U2VhcmNoKGludCBBW10sIGludCBuLCBpbnQgeCkKewogICAgLy8gc2VhcmNoIHNwYWNlIGlzIEFbbG93Li5oaWdoXQogICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBuIC0gMTsKCiAgICAvLyBpdGVyYXRlIHRpbGwgc2VhcmNoIHNwYWNlIGNvbnRhaW5zIGF0LWxlYXN0IG9uZSBlbGVtZW50CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CiAgICAgICAgLy8gZmluZCB0aGUgbWlkIHZhbHVlIGluIHRoZSBzZWFyY2ggc3BhY2UgYW5kCiAgICAgICAgLy8gY29tcGFyZXMgaXQgd2l0aCB0YXJnZXQgdmFsdWUKICAgICAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpLzI7CgogICAgICAgIC8vIGlmIHRhcmdldCBpcyBmb3VuZCwgcmV0dXJuIGl0cyBpbmRleAogICAgICAgIGlmICh4ID09IEFbbWlkXSkKICAgICAgICAgICAgcmV0dXJuIG1pZDsKCiAgICAgICAgLy8gaWYgcmlnaHQgaGFsZiAoQVttaWQuLmhpZ2hdKSBpcyBzb3J0ZWQgYW5kIG1pZCBpcyBub3QKICAgICAgICAvLyB0aGUgdGFyZ2V0IGVsZW1lbnQKICAgICAgICBpZiAoQVttaWRdIDw9IEFbaGlnaF0pCiAgICAgICAgewogICAgICAgICAgICAvLyBjb21wYXJlIHRhcmdldCB3aXRoIEFbbWlkXSBhbmQgQVtoaWdoXSB0byBrbm93CiAgICAgICAgICAgIC8vIGlmIGl0IGxpZXMgaW4gQVttaWQuLmhpZ2hdIG9yIG5vdAogICAgICAgICAgICBpZiAoeCA+IEFbbWlkXSAmJiB4IDw9IEFbaGlnaF0pCiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOyAgICAvLyBnbyBzZWFyY2hpbmcgaW4gcmlnaHQgc29ydGVkIGhhbGYKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7ICAgIC8vIGdvIHNlYXJjaGluZyBsZWZ0CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBsZWZ0IGhhbGYgKEFbbG93Li5taWRdKSBpcyBzb3J0ZWQgYW5kIG1pZCBpcyBub3QKICAgICAgICAvLyB0aGUgdGFyZ2V0IGVsZW1lbnQKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvLyBjb21wYXJlIHRhcmdldCB3aXRoIEFbbG93XSBhbmQgQVttaWRdIHRvIGtub3cKICAgICAgICAgICAgLy8gaWYgaXQgbGllcyBpbiBBW2xvdy4ubWlkXSBvciBub3QKICAgICAgICAgICAgaWYgKHggPj0gQVtsb3ddICYmIHggPCBBW21pZF0pCiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsgICAgLy8gZ28gc2VhcmNoaW5nIGluIGxlZnQgc29ydGVkIGhhbGYKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsgICAgLy8gZ28gc2VhcmNoaW5nIHJpZ2h0CiAgICAgICAgfQogICAgfQoKICAgIC8vIHRhcmdldCBub3QgZm91bmQgb3IgaW52YWxpZCBpbnB1dAogICAgcmV0dXJuIC0xOwp9CgovLyBtYWluIGZ1bmN0aW9uCmludCBtYWluKHZvaWQpCnsKICAgIGludCBBW10gPSB7OSwgMTAsIDIsIDUsIDYsIDh9OwogICAgaW50IHRhcmdldCA9IDU7CgogICAgaW50IG4gPSBzaXplb2YoQSkvc2l6ZW9mKEFbMF0pOwogICAgaW50IGluZGV4ID0gY2lyY3VsYXJBcnJheVNlYXJjaChBLCBuLCB0YXJnZXQpOwoKICAgIGlmIChpbmRleCAhPSAtMSkKICAgICAgICBwcmludGYoIkVsZW1lbnQgZm91bmQgYXQgaW5kZXggJWQiLCBpbmRleCk7CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCBpbiB0aGUgYXJyYXkiKTsKCiAgICByZXR1cm4gMDsKfQ==