#include <stdio.h>
// find out if a target x exists in the sorted array A
// or not using Interpolation search algorithm
int InterpolationSearch(int A[], int n, int x)
{
// search space is A[low..high]
int low = 0, high = n - 1, mid;
while (A[high] != A[low] && x >= A[low] && x <= A[high])
{
// estimate mid
mid = low + ((x - A[low]) * (high - low) / (A[high] - A[low]));
// target value is found
if (x == A[mid])
return mid;
// discard all elements in the right search space
// including the mid element
else if (x < A[mid])
high = mid - 1;
// discard all elements in the left search space
// including the mid element
else
low = mid + 1;
}
// if target is found
if (x == A[low])
return low ;
// x doesn't exist in the array
else
return -1;
}
// Interpolation search algorithm
int main(void)
{
int A[] = {2, 5, 6, 8, 9, 10};
int target = 5;
int n = sizeof(A)/sizeof(A[0]);
int index = InterpolationSearch(A, n, target);
if (index != -1)
printf("Element found at index %d", index
); else
printf("Element not found in the array");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBmaW5kIG91dCBpZiBhIHRhcmdldCB4IGV4aXN0cyBpbiB0aGUgc29ydGVkIGFycmF5IEEKLy8gb3Igbm90IHVzaW5nIEludGVycG9sYXRpb24gc2VhcmNoIGFsZ29yaXRobQppbnQgSW50ZXJwb2xhdGlvblNlYXJjaChpbnQgQVtdLCBpbnQgbiwgaW50IHgpCnsKICAgIC8vIHNlYXJjaCBzcGFjZSBpcyBBW2xvdy4uaGlnaF0KICAgIGludCBsb3cgPSAwLCBoaWdoID0gbiAtIDEsIG1pZDsKCiAgICB3aGlsZSAoQVtoaWdoXSAhPSBBW2xvd10gJiYgeCA+PSBBW2xvd10gJiYgeCA8PSBBW2hpZ2hdKQogICAgewogICAgICAgIC8vIGVzdGltYXRlIG1pZAogICAgICAgIG1pZCA9IGxvdyArICgoeCAtIEFbbG93XSkgKiAoaGlnaCAtIGxvdykgLyAoQVtoaWdoXSAtIEFbbG93XSkpOwoKICAgICAgICAvLyB0YXJnZXQgdmFsdWUgaXMgZm91bmQKICAgICAgICBpZiAoeCA9PSBBW21pZF0pCiAgICAgICAgICAgIHJldHVybiBtaWQ7CgogICAgICAgIC8vIGRpc2NhcmQgYWxsIGVsZW1lbnRzIGluIHRoZSByaWdodCBzZWFyY2ggc3BhY2UKICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIG1pZCBlbGVtZW50CiAgICAgICAgZWxzZSBpZiAoeCA8IEFbbWlkXSkKICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CgogICAgICAgIC8vIGRpc2NhcmQgYWxsIGVsZW1lbnRzIGluIHRoZSBsZWZ0IHNlYXJjaCBzcGFjZQogICAgICAgIC8vIGluY2x1ZGluZyB0aGUgbWlkIGVsZW1lbnQKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICB9CgogICAgLy8gaWYgdGFyZ2V0IGlzIGZvdW5kCiAgICBpZiAoeCA9PSBBW2xvd10pCiAgICAgICAgcmV0dXJuIGxvdyA7CgogICAgLy8geCBkb2Vzbid0IGV4aXN0IGluIHRoZSBhcnJheQogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKLy8gSW50ZXJwb2xhdGlvbiBzZWFyY2ggYWxnb3JpdGhtCmludCBtYWluKHZvaWQpCnsKICAgIGludCBBW10gPSB7MiwgNSwgNiwgOCwgOSwgMTB9OwogICAgaW50IHRhcmdldCA9IDU7CgogICAgaW50IG4gPSBzaXplb2YoQSkvc2l6ZW9mKEFbMF0pOwogICAgaW50IGluZGV4ID0gSW50ZXJwb2xhdGlvblNlYXJjaChBLCBuLCB0YXJnZXQpOwoKICAgIGlmIChpbmRleCAhPSAtMSkKICAgICAgICBwcmludGYoIkVsZW1lbnQgZm91bmQgYXQgaW5kZXggJWQiLCBpbmRleCk7CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCBpbiB0aGUgYXJyYXkiKTsKCiAgICByZXR1cm4gMDsKfQ==