Input is - ordered array. Comparison is with middle item, if matched it then we found target, if middle is greater then we must check in the same way all items from the left side of the middle item, otherwise - on right side.
#include <stdio.h>
#include "algutils.h"
template<typename T>
int binsearch(T *arr, int len, const T& target)
{
int mid, off = 0;
while (1) {
if (!len) return (-1);
mid = len/2;
if (arr[mid] == target) return (off + mid);
len = mid;
if (arr[mid] < target) {
off += mid + 1;
arr = &arr[mid+1];
}
}
}
/***********************************************************************
Main
***********************************************************************/
int main(void)
{
#define LIST(...) {__VA_ARGS__}
#define TEST(EL, RESULT, L) do { \
int arr[] = L; \
int s = binsearch(arr, sizeofarray(arr), (EL)); \
printf("Binary search of %d: %d (%s)\n", (EL), s, \
s==(RESULT)?"true":"FALSE"); \
} while (0)
TEST(1, 0, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(2, 1, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(14, 9, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(15, 10, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(24, 11, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(55, 12, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
TEST(240, -1, LIST(1,2,3,4,5,6,8,9,10,14,15,24,55));
return (0);
}
Комментариев нет:
Отправить комментарий
Thanks for your posting!