bsearch.c 978 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /*
  2. * Copyright (c) 2019 Balaji Kulkarni
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. /**
  9. * @brief Generic implementation of Binary Search
  10. *
  11. * @param key pointer to first element to search
  12. * @param array pointer to item being searched for
  13. * @param count number of elements
  14. * @param size size of each element
  15. * @param cmp pointer to comparison function
  16. *
  17. * @return pointer to key if present in the array, or NULL otherwise
  18. */
  19. void *bsearch(const void *key, const void *array, size_t count, size_t size,
  20. int (*cmp)(const void *key, const void *element))
  21. {
  22. size_t low = 0;
  23. size_t high = count;
  24. size_t index;
  25. int result;
  26. const char *pivot;
  27. while (low < high) {
  28. index = low + (high - low) / 2;
  29. pivot = (const char *)array + index * size;
  30. result = cmp(key, pivot);
  31. if (result == 0) {
  32. return (void *)pivot;
  33. } else if (result > 0) {
  34. low = index + 1;
  35. } else {
  36. high = index;
  37. }
  38. }
  39. return NULL;
  40. }