-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy path104-advanced_binary.c
65 lines (55 loc) · 1.42 KB
/
104-advanced_binary.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "search_algos.h"
int recurse_helper(int *array, size_t left,
size_t right, int value, ssize_t *match);
/**
* advanced_binary - search for value in array of sorted ints
* @array: array to search
* @size: size of array
* @value: value to search
*
* Return: index of found value; or -1 if not found
*/
int advanced_binary(int *array, size_t size, int value)
{
ssize_t match = -1;
if (array == NULL)
return (-1);
return (recurse_helper(array, 0, size - 1, value, &match));
}
/**
* recurse_helper - recursive implement of binary search
* @array: array to search
* @left: leftmost index
* @right: rightmost index
* @value: value to search
* @match: pointer to index of most recent match
*
* Return: index of found value; or -1 if not found
*/
int recurse_helper(int *array, size_t left,
size_t right, int value, ssize_t *match)
{
size_t i = left, mid;
if (left > right)
return (*match);
/* print search progress */
printf("Searching in array: %d", array[i++]);
while (i <= right)
printf(", %d", array[i++]);
printf("\n");
/* calculate mid */
mid = left + ((right - left) / 2);
/* check if mid is value */
if (array[mid] == value)
{
*match = mid;
if (right - left > 1)
mid++;
}
else if (array[mid] < value) /* search right */
return (recurse_helper(array, mid + 1, right, value, match));
if (mid != 0)
return (recurse_helper(array, left, mid - 1, value, match));
else
return (*match);
}