added iterative algorithm for binary_search

This commit is contained in:
Krishna Vedala 2020-06-30 14:17:12 -04:00
parent 3b0ff5fd7b
commit e75dfb8646
No known key found for this signature in database
GPG Key ID: BA19ACF8FC8792F7

View File

@ -3,6 +3,9 @@
* @brief Program to perform [binary * @brief Program to perform [binary
* search](https://en.wikipedia.org/wiki/Binary_search_algorithm) of a target * search](https://en.wikipedia.org/wiki/Binary_search_algorithm) of a target
* value in a given *sorted* array. * value in a given *sorted* array.
* @authors [James McDermott](https://github.com/theycallmemac) - recursive
* algorithm
* @authors [Krishna Vedala](https://github.com/kvedala) - iterative algorithm
*/ */
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
@ -15,7 +18,7 @@
* \returns location of x assuming array arr[l..r] is present * \returns location of x assuming array arr[l..r] is present
* \returns -1 otherwise * \returns -1 otherwise
*/ */
int binarysearch(const int *arr, int l, int r, int x) int binarysearch1(const int *arr, int l, int r, int x)
{ {
if (r >= l) if (r >= l)
{ {
@ -27,16 +30,47 @@ int binarysearch(const int *arr, int l, int r, int x)
// If element is smaller than middle // If element is smaller than middle
if (arr[mid] > x) if (arr[mid] > x)
return binarysearch(arr, l, mid - 1, x); return binarysearch1(arr, l, mid - 1, x);
// Else element is in right subarray // Else element is in right subarray
return binarysearch(arr, mid + 1, r, x); return binarysearch1(arr, mid + 1, r, x);
} }
// When element is not present in array // When element is not present in array
return -1; return -1;
} }
/** Iterative implementation
* \param[in] arr array to search
* \param l left index of search range
* \param r right index of search range
* \param x target value to search for
* \returns location of x assuming array arr[l..r] is present
* \returns -1 otherwise
*/
int binarysearch2(const int *arr, int l, int r, int x)
{
int mid = l + (r - l) / 2;
while (arr[mid] != x)
{
if (r <= l || r < 0)
return -1;
if (arr[mid] > x)
// If element is smaller than middle
r = mid - 1;
else
// Else element is in right subarray
l = mid + 1;
mid = l + (r - l) / 2;
}
// When element is not present in array
return mid;
}
/** Test implementations */ /** Test implementations */
void test() void test()
{ {
@ -49,16 +83,22 @@ void test()
// set value to look for // set value to look for
int x = 10; int x = 10;
// set result to what is returned from binarysearch // set result to what is returned from binarysearch
int result = binarysearch(arr, 0, n - 1, x); int result = binarysearch1(arr, 0, n - 1, x);
assert(result == 3); assert(result == 3);
printf("passed\n"); printf("passed recursive... ");
result = binarysearch2(arr, 0, n - 1, x);
assert(result == 3);
printf("passed iterative...\n");
printf("Test 2.... "); printf("Test 2.... ");
x = 5; x = 5;
// set result to what is returned from binarysearch // set result to what is returned from binarysearch
result = binarysearch(arr, 0, n - 1, x); result = binarysearch1(arr, 0, n - 1, x);
assert(result == -1); assert(result == -1);
printf("passed\n"); printf("passed recursive... ");
result = binarysearch2(arr, 0, n - 1, x);
assert(result == -1);
printf("passed iterative...\n");
} }
/** Main function */ /** Main function */