#include <stdio.h>
// Utility function to find minimum of two numbers
int min(int x, int y) {
return (x < y) ? x : y;
}
// Binary search algorithm to return the position of
// target x in the sub-array arr[low..high]
int BinarySearch(int arr[], int low, int high, int x)
{
// Base condition (search space is exhausted)
if (low > high)
return -1;
// we find the mid value in the search space and
// compares it with target value
int mid = (low + high)/2; // overflow can happen
// int mid = low + (high - low)/2;
// Base condition (target value is found)
if (x == arr[mid])
return mid;
// discard all elements in the right search space
// including the mid element
else if (x < arr[mid])
return BinarySearch(arr, low, mid - 1, x);
// discard all elements in the left search space
// including the mid element
else
return BinarySearch(arr, mid + 1, high, x);
}
// Returns the position of target x in the given array of length n
int ExponentialSearch(int arr[], int n, int x)
{
int bound = 1;
// find the range in which the target x would reside
while (bound < n && arr[bound] < x)
bound *= 2; // calculate the next power of 2
// call binary search on arr[bound/2 .. min(bound, n)]
return BinarySearch(arr, bound/2, min(bound, n), x);
}
// Exponential search algorithm
int main(void)
{
int arr[] = {2, 5, 6, 8, 9, 10};
int target = 9;
int n = sizeof(arr)/sizeof(arr[0]);
int index = ExponentialSearch(arr, n, target);
if (index != -1)
printf("Element found at index %d", index
); else
printf("Element not found in the array");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgbWluaW11bSBvZiB0d28gbnVtYmVycwppbnQgbWluKGludCB4LCBpbnQgeSkgewogICAgcmV0dXJuICh4IDwgeSkgPyB4IDogeTsKfQoKLy8gQmluYXJ5IHNlYXJjaCBhbGdvcml0aG0gdG8gcmV0dXJuIHRoZSBwb3NpdGlvbiBvZgovLyB0YXJnZXQgeCBpbiB0aGUgc3ViLWFycmF5IGFycltsb3cuLmhpZ2hdCmludCBCaW5hcnlTZWFyY2goaW50IGFycltdLCBpbnQgbG93LCBpbnQgaGlnaCwgaW50IHgpCnsKICAgIC8vIEJhc2UgY29uZGl0aW9uIChzZWFyY2ggc3BhY2UgaXMgZXhoYXVzdGVkKQogICAgaWYgKGxvdyA+IGhpZ2gpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIC8vIHdlIGZpbmQgdGhlIG1pZCB2YWx1ZSBpbiB0aGUgc2VhcmNoIHNwYWNlIGFuZAogICAgLy8gY29tcGFyZXMgaXQgd2l0aCB0YXJnZXQgdmFsdWUKCiAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpLzI7ICAgIC8vIG92ZXJmbG93IGNhbiBoYXBwZW4KICAgIC8vIGludCBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdykvMjsKCiAgICAvLyBCYXNlIGNvbmRpdGlvbiAodGFyZ2V0IHZhbHVlIGlzIGZvdW5kKQogICAgaWYgKHggPT0gYXJyW21pZF0pCiAgICAgICAgcmV0dXJuIG1pZDsKCiAgICAvLyBkaXNjYXJkIGFsbCBlbGVtZW50cyBpbiB0aGUgcmlnaHQgc2VhcmNoIHNwYWNlCiAgICAvLyBpbmNsdWRpbmcgdGhlIG1pZCBlbGVtZW50CiAgICBlbHNlIGlmICh4IDwgYXJyW21pZF0pCiAgICAgICAgcmV0dXJuIEJpbmFyeVNlYXJjaChhcnIsIGxvdywgIG1pZCAtIDEsIHgpOwoKICAgIC8vIGRpc2NhcmQgYWxsIGVsZW1lbnRzIGluIHRoZSBsZWZ0IHNlYXJjaCBzcGFjZQogICAgLy8gaW5jbHVkaW5nIHRoZSBtaWQgZWxlbWVudAogICAgZWxzZQogICAgICAgIHJldHVybiBCaW5hcnlTZWFyY2goYXJyLCBtaWQgKyAxLCAgaGlnaCwgeCk7Cn0KCi8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRhcmdldCB4IGluIHRoZSBnaXZlbiBhcnJheSBvZiBsZW5ndGggbgppbnQgRXhwb25lbnRpYWxTZWFyY2goaW50IGFycltdLCBpbnQgbiwgaW50IHgpCnsKICAgIGludCBib3VuZCA9IDE7CgogICAgLy8gZmluZCB0aGUgcmFuZ2UgaW4gd2hpY2ggdGhlIHRhcmdldCB4IHdvdWxkIHJlc2lkZQogICAgd2hpbGUgKGJvdW5kIDwgbiAmJiBhcnJbYm91bmRdIDwgeCkKICAgICAgICBib3VuZCAqPSAyOyAgICAvLyBjYWxjdWxhdGUgdGhlIG5leHQgcG93ZXIgb2YgMgoKICAgIC8vIGNhbGwgYmluYXJ5IHNlYXJjaCBvbiBhcnJbYm91bmQvMiAuLiBtaW4oYm91bmQsIG4pXQogICAgcmV0dXJuIEJpbmFyeVNlYXJjaChhcnIsIGJvdW5kLzIsIG1pbihib3VuZCwgbiksIHgpOwp9CgovLyBFeHBvbmVudGlhbCBzZWFyY2ggYWxnb3JpdGhtCmludCBtYWluKHZvaWQpCnsKICAgIGludCBhcnJbXSA9IHsyLCA1LCA2LCA4LCA5LCAxMH07CiAgICBpbnQgdGFyZ2V0ID0gOTsKCiAgICBpbnQgbiA9IHNpemVvZihhcnIpL3NpemVvZihhcnJbMF0pOwogICAgaW50IGluZGV4ID0gRXhwb25lbnRpYWxTZWFyY2goYXJyLCBuLCB0YXJnZXQpOwoKICAgIGlmIChpbmRleCAhPSAtMSkKICAgICAgICBwcmludGYoIkVsZW1lbnQgZm91bmQgYXQgaW5kZXggJWQiLCBpbmRleCk7CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCBpbiB0aGUgYXJyYXkiKTsKCiAgICByZXR1cm4gMDsKfQ==