/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static int interpolationSearch(int[] sortedArray, int toFind)
{
int low = 0;
int high = sortedArray.length - 1;
int mid;
while (sortedArray[low] <= toFind && sortedArray[high] >= toFind)
{
if (sortedArray[high] - sortedArray[low] == 0)
return (low + high)/2;
/** out of range is possible here **/
mid = low + ((toFind - sortedArray[low]) * (high - low)) / (sortedArray[high] - sortedArray[low]);
if (sortedArray[mid] < toFind)
low = mid + 1;
else if (sortedArray[mid] > toFind)
high = mid - 1;
else
return mid;
}
if (sortedArray[low] == toFind)
return low;
/** not found **/
else
return -1;
}
/** Main method **/
public static void main
(String[] args
) {
Scanner scan
= new Scanner
( System.
in ); System.
out.
println("Interpolation Search Test\n"); int n, i;
/** Accept number of elements **/
System.
out.
println("Enter number of integer elements"); n = scan.nextInt();
/** Create integer array on n elements **/
int arr[] = new int[ n ];
/** Accept elements **/
System.
out.
println("\nEnter "+ n
+" sorted integer elements"); for (i = 0; i < n; i++)
arr[i] = scan.nextInt();
System.
out.
println("\nEnter element to search for : "); int key = scan.nextInt();
int result = interpolationSearch(arr, key);
if (result == -1)
System.
out.
println("\n"+ key
+" element not found"); else
System.
out.
println("\n"+ key
+" elemnt found at position "+ result
);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgaW50IGludGVycG9sYXRpb25TZWFyY2goaW50W10gc29ydGVkQXJyYXksIGludCB0b0ZpbmQpCgkgICAgewoJICAgICAgICBpbnQgbG93ID0gMDsKCSAgICAgICAgaW50IGhpZ2ggPSBzb3J0ZWRBcnJheS5sZW5ndGggLSAxOwoJICAgICAgICBpbnQgbWlkOwoJICAgICAgICB3aGlsZSAoc29ydGVkQXJyYXlbbG93XSA8PSB0b0ZpbmQgJiYgc29ydGVkQXJyYXlbaGlnaF0gPj0gdG9GaW5kKSAKCSAgICAgICAgewoJICAgICAgICAgICAgaWYgKHNvcnRlZEFycmF5W2hpZ2hdIC0gc29ydGVkQXJyYXlbbG93XSA9PSAwKQoJICAgICAgICAgICAgICAgIHJldHVybiAobG93ICsgaGlnaCkvMjsKCSAgICAgICAgICAgIC8qKiBvdXQgb2YgcmFuZ2UgaXMgcG9zc2libGUgIGhlcmUgKiovCgkgICAgICAgICAgICAgbWlkID0gbG93ICsgKCh0b0ZpbmQgLSBzb3J0ZWRBcnJheVtsb3ddKSAqIChoaWdoIC0gbG93KSkgLyAoc29ydGVkQXJyYXlbaGlnaF0gLSBzb3J0ZWRBcnJheVtsb3ddKTsgIAoJIAoJICAgICAgICAgICAgIGlmIChzb3J0ZWRBcnJheVttaWRdIDwgdG9GaW5kKQoJICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwoJICAgICAgICAgICAgIGVsc2UgaWYgKHNvcnRlZEFycmF5W21pZF0gPiB0b0ZpbmQpCgkgICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwoJICAgICAgICAgICAgIGVsc2UKCSAgICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoc29ydGVkQXJyYXlbbG93XSA9PSB0b0ZpbmQpCgkgICAgICAgICAgICByZXR1cm4gbG93OwoJICAgICAgICAgICAvKiogbm90IGZvdW5kICoqLwoJICAgICAgICBlbHNlCgkgICAgICAgICAgICByZXR1cm4gLTE7IAoJICAgIH0gICAgCgkgICAgLyoqIE1haW4gbWV0aG9kICoqLwoJICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAoJICAgIHsKCSAgICAgICAgU2Nhbm5lciBzY2FuID0gbmV3IFNjYW5uZXIoIFN5c3RlbS5pbiApOyAgICAgICAgCgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJwb2xhdGlvbiBTZWFyY2ggVGVzdFxuIik7CgkgICAgICAgIGludCBuLCBpOwoJICAgICAgICAKCSAgICAgICAgLyoqIEFjY2VwdCBudW1iZXIgb2YgZWxlbWVudHMgKiovCgkgICAgICAgIAoJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyIG51bWJlciBvZiBpbnRlZ2VyIGVsZW1lbnRzIik7CgkgICAgICAgIG4gPSBzY2FuLm5leHRJbnQoKTsKCSAgICAgICAgCgkgICAgICAgIC8qKiBDcmVhdGUgaW50ZWdlciBhcnJheSBvbiBuIGVsZW1lbnRzICoqLwoJICAgICAgICBpbnQgYXJyW10gPSBuZXcgaW50WyBuIF07CgkgICAgICAgIC8qKiBBY2NlcHQgZWxlbWVudHMgKiovCgkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5FbnRlciAiKyBuICsiIHNvcnRlZCBpbnRlZ2VyIGVsZW1lbnRzIik7CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkgICAgICAgICAgICBhcnJbaV0gPSBzY2FuLm5leHRJbnQoKTsKCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkVudGVyIGVsZW1lbnQgdG8gc2VhcmNoIGZvciA6ICIpOwoJICAgICAgICBpbnQga2V5ID0gc2Nhbi5uZXh0SW50KCk7CgkgCgkgICAgICAgIGludCByZXN1bHQgPSBpbnRlcnBvbGF0aW9uU2VhcmNoKGFyciwga2V5KTsKCSAKCSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKCSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4iKyBrZXkgKyIgZWxlbWVudCBub3QgZm91bmQiKTsKCSAgICAgICAgZWxzZQoJICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiIrIGtleSArIiBlbGVtbnQgZm91bmQgYXQgcG9zaXRpb24gIisgcmVzdWx0KTsKCSAKCSAgICB9Cn0=