Done
This commit is contained in:
parent
a04a66c509
commit
add23e123e
23 changed files with 1041 additions and 107 deletions
|
|
@ -3,7 +3,7 @@
|
|||
*-----------------------------------------------------------------------------
|
||||
* Exercise Number: S07
|
||||
* Title: Binary search implementation
|
||||
* Author: */<your name>;/*
|
||||
* Author: Marc Tismonar
|
||||
*-----------------------------------------------------------------------------
|
||||
* Description:
|
||||
* Implements the binary search algorithm
|
||||
|
|
@ -11,3 +11,91 @@
|
|||
*/
|
||||
|
||||
#include "binary_search.h"
|
||||
|
||||
/**
|
||||
* Searches the given needle within the given haystack using binary search approach.
|
||||
*
|
||||
* Implementation hint: delegate the invocation to function `binary_search_list_limited(…)`.
|
||||
*
|
||||
* @param haystack The sorted list in which the `needle` is searched.
|
||||
* @param criterion The pointer to the function that implements the sorting criterion of the list.
|
||||
* That function accepts two integer parameters and returns a boolean value.
|
||||
* @param needle The value to find within the haystack.
|
||||
* @return The index of the `needle` within the list if it was found or the position where the needle need to
|
||||
* be inserted into the sorted list if it is not included in the list. The insertion position is
|
||||
* expressed as index with negative sign, so that the value can be inserted at index (-1 * result).
|
||||
*/
|
||||
int binary_search_list(IntList haystack, criterion_fn criterion, int needle) {
|
||||
if (!list_is_valid(haystack)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return binary_search_list_limited(haystack, list_get_size(haystack), criterion, needle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches the given needle within the given haystack up the given length using binary search approach.
|
||||
*
|
||||
* @param haystack The sorted list in which the `needle` is searched.
|
||||
* @param length The number of items to consider starting from the beginning of the haystack.
|
||||
* If the haystack contains more items, the remaining items are omitted from the search. If it contains
|
||||
* less items, the number of items are clipped to the size of the haystack.
|
||||
* @param criterion The pointer to the function that implements the sorting criterion of the list.
|
||||
* That function accepts two integer parameters and returns a boolean value.
|
||||
* @param needle The value to find within the haystack.
|
||||
* @return The index of the `needle` within the list if it was found or the position where the needle need to
|
||||
* be inserted into the sorted list if it is not included in the list. The insertion position is
|
||||
* expressed as index with negative sign, so that the value can be inserted at index (-1 * result).
|
||||
*/
|
||||
int binary_search_list_limited(IntList haystack, int length, criterion_fn criterion, int needle) {
|
||||
if (!list_is_valid(haystack) || criterion == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int list_size = list_get_size(haystack);
|
||||
if (length > list_size) {
|
||||
length = list_size;
|
||||
}
|
||||
|
||||
if (length <= 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int left = 0;
|
||||
int right = length - 1;
|
||||
|
||||
while (left <= right) {
|
||||
int mid = left + (right - left) / 2;
|
||||
int mid_value = list_get_at(haystack, mid);
|
||||
|
||||
if (mid_value == needle) {
|
||||
return mid;
|
||||
}
|
||||
|
||||
if (criterion(mid_value, needle)) {
|
||||
left = mid + 1;
|
||||
} else {
|
||||
right = mid - 1;
|
||||
}
|
||||
}
|
||||
|
||||
return -left;
|
||||
}
|
||||
|
||||
/* ARRAY VARIANT */
|
||||
|
||||
/**
|
||||
* Searches the given needle within the given haystack using binary search approach.
|
||||
*
|
||||
* @param haystack The sorted list in which the `needle` is searched.
|
||||
* @param length The length of the haystack array.
|
||||
* @param criterion The pointer to the function that implements the sorting criterion of the list.
|
||||
* That function accepts two integer parameters and returns a boolean value.
|
||||
* @param needle The value to find within the haystack.
|
||||
* @return The index of the `needle` within the list if it was found or the position where the needle need to
|
||||
* be inserted into the sorted list if it is not included in the list. The insertion position is
|
||||
* expressed as index with negative sign, so that the value can be inserted at index (-1 * result).
|
||||
*/
|
||||
int binary_search_array(int haystack[], int length, criterion_fn criterion, int needle) {
|
||||
return -1;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue