diff --git a/Search/Interpolation_Search/Interpolation_search.cpp b/Search/Interpolation_Search/Interpolation_search.cpp new file mode 100644 index 0000000..5c47637 --- /dev/null +++ b/Search/Interpolation_Search/Interpolation_search.cpp @@ -0,0 +1,59 @@ +// C++ program to implement interpolation search +#include +using namespace std; + +// If x is present in arr[0..n-1], then returns +// index of it, else returns -1. +int interpolationSearch(int arr[], int n, int x) +{ + // Find indexes of two corners + int lo = 0, hi = (n - 1); + + // Since array is sorted, an element present + // in array must be in range defined by corner + while (lo <= hi && x >= arr[lo] && x <= arr[hi]) + { + if (lo == hi) + { + if (arr[lo] == x) return lo; + return -1; + } + // Probing the position with keeping + // uniform distribution in mind. + int pos = lo + (((double)(hi - lo) / + (arr[hi] - arr[lo])) * (x - arr[lo])); + + // Condition of target found + if (arr[pos] == x) + return pos; + + // If x is larger, x is in upper part + if (arr[pos] < x) + lo = pos + 1; + + // If x is smaller, x is in the lower part + else + hi = pos - 1; + } + return -1; +} + +// Driver Code +int main() +{ + // Array of items on which search will + // be conducted. + int arr[] = {10, 12, 13, 16, 18, 19, 20, 21, + 22, 23, 24, 33, 35, 42, 47}; + int n = sizeof(arr)/sizeof(arr[0]); + + int x = 18; // Element to be searched + int index = interpolationSearch(arr, n, x); + + // If element was found + if (index != -1) + cout << "Element found at index " << index; + else + cout << "Element not found."; + return 0; +} diff --git a/Search/Interpolation_Search/README.md b/Search/Interpolation_Search/README.md index 24a90d8..2250be0 100644 --- a/Search/Interpolation_Search/README.md +++ b/Search/Interpolation_Search/README.md @@ -1 +1,18 @@ -Content \ No newline at end of file +# Interpolation Search + +## Algorithm +```c + STEP 1:In a loop, calculate the value of “pos” using the probe position formula. + STEP 2:If it is a match, return the index of the item, and exit. + STEP 3:If the item is less than arr[pos], calculate the probe position of the left sub-array. Otherwise calculate the same in the right sub-array. + STEP 4:Repeat until a match is found or the sub-array reduces to zero. + ``` +--- +## Explanation + The Interpolation Search is an improvement over Binary Search for instances, where the values in a sorted array are uniformly distributed. + Binary Search always goes to the middle element to check. + On the other hand, interpolation search may go to different locations according to the value of the key being searched. + For example, if the value of the key is closer to the last element, interpolation search is likely to start search toward the end side. + + +## [Interpolation search c++ implementation](Interpolation_search.cpp)