diff --git a/__main__.py b/__main__.py index ca8e13a29ad15f0e464ab98cc1c79754be4f32b3..b369571643756636ca86f40317669f015d10a616 100644 --- a/__main__.py +++ b/__main__.py @@ -83,8 +83,11 @@ def node_is_full(node): def redistribute_keys(left_node, right_node, left_index, right_index): - right_node.keys = left_node.keys[right_index:] - left_node.keys = left_node.keys[:left_index] + for i in range(right_index, len(left_node.keys)): + right_node.keys.append(left_node.keys[i]) + + for i in range(left_index, len(left_node.keys)): + left_node.keys.pop() def split_leaf(node, key): @@ -477,7 +480,6 @@ def main(): bptree_delete(root, 47) # bptree_delete(root, 65) - bptree_print(root) diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..2ab95ed890da7bf58a65f046688d633b0d6e5fb4 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,24 @@ +TARGET = program +LIBS = -lm +CC = gcc +CFLAGS = -g -Wall -Wextra -pedantic -Ofast +# CFLAGS += -fsanitize=address -fsanitize=leak + +.PHONY: default all clean + +default: $(TARGET) +all: default + +OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJECTS) + +$(TARGET): $(OBJECTS) + $(CC) $(OBJECTS) ${CFLAGS} $(LIBS) -o $@ + +clean: + rm -f *.o ${TARGET}* diff --git a/src/bptree.h b/src/bptree.h new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000000000000000000000000000000000000..3da830eaa6c695c46fe8f7194759adcb75c41e20 --- /dev/null +++ b/src/main.c @@ -0,0 +1,29 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "sorted_array.h" + +int main() { + int *array = (int *)malloc(sizeof(int) * 10); + int array_length = 0; + + sorted_array_insert(array, &array_length, 3); + sorted_array_insert(array, &array_length, 11); + sorted_array_insert(array, &array_length, 5); + sorted_array_insert(array, &array_length, 1); + sorted_array_insert(array, &array_length, 15); + sorted_array_insert(array, &array_length, 12); + sorted_array_insert(array, &array_length, 8); + sorted_array_print(array, array_length); + + sorted_array_delete(array, &array_length, 12); + sorted_array_delete(array, &array_length, 1); + sorted_array_delete(array, &array_length, 15); + sorted_array_delete(array, &array_length, 5); + sorted_array_delete(array, &array_length, 8); + sorted_array_delete(array, &array_length, 11); + sorted_array_delete(array, &array_length, 3); + sorted_array_print(array, array_length); + + return EXIT_SUCCESS; +} diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..430793ffa0d07259fdf13973a75857418dc744d3 Binary files /dev/null and b/src/main.o differ diff --git a/src/program b/src/program new file mode 100644 index 0000000000000000000000000000000000000000..d77345c41e98d225093d0a372100bb75b4155945 Binary files /dev/null and b/src/program differ diff --git a/src/sorted_array.c b/src/sorted_array.c new file mode 100644 index 0000000000000000000000000000000000000000..0fc9d9190fd037d48a186151f45aabfc03ef59a8 --- /dev/null +++ b/src/sorted_array.c @@ -0,0 +1,83 @@ +#include "sorted_array.h" + +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + +int lower_bound(int *array, int array_length, int value) { + int low = 0; + int high = array_length - 1; + + while (low <= high) { + int m = (low + high) / 2; + + if (array[m] < value) { + low = m + 1; + } else if (array[m] > value) { + high = m - 1; + } else { + return m; + } + } + + return low; +} + +int sorted_array_find_index(int *array, int array_length, int value) { + int low = 0; + int high = array_length - 1; + + while (low <= high) { + int m = (low + high) / 2; + + if (array[m] < value) { + low = m + 1; + } else if (array[m] > value) { + high = m - 1; + } else { + return m; + } + } + + return -1; +} + +bool sorted_array_search(int *array, int array_length, int value, int *index) { + int i = sorted_array_find_index(array, array_length, value); + + if (index != NULL) { + *index = i; + } + + return i != -1; +} + +void sorted_array_print(int *array, int array_length) { + for (int i = 0; i < array_length; i++) { + printf("%d ", array[i]); + } + + printf("\n"); +} + +int sorted_array_insert(int *array, int *array_length, int value) { + int index = lower_bound(array, *array_length, value); + + for (int i = *array_length - 1; i >= index; i--) { + array[i + 1] = array[i]; + } + + array[index] = value; + *array_length += 1; + return index; +} + +void sorted_array_delete(int *array, int *array_length, int value) { + int index = sorted_array_find_index(array, *array_length, value); + + for (int i = index; i < *array_length; i++) { + array[i] = array[i + 1]; + } + + *array_length -= 1; +} diff --git a/src/sorted_array.h b/src/sorted_array.h new file mode 100644 index 0000000000000000000000000000000000000000..e1088323b25e7064aaa6617138c602bb3da527e8 --- /dev/null +++ b/src/sorted_array.h @@ -0,0 +1,15 @@ +#ifndef SORTED_ARRAY_H +#define SORTED_ARRAY_H + +#include <stdbool.h> + +int lower_bound(int *array, int array_length, int value); + +int sorted_array_find_index(int *array, int array_length, int value); +bool sorted_array_search(int *array, int array_length, int value, int *index); +void sorted_array_print(int *array, int array_length); + +int sorted_array_insert(int *array, int *array_length, int value); +void sorted_array_delete(int *array, int *array_length, int value); + +#endif diff --git a/src/sorted_array.o b/src/sorted_array.o new file mode 100644 index 0000000000000000000000000000000000000000..b5cdc315a1c1cef35f42c2424ca12b6288091a13 Binary files /dev/null and b/src/sorted_array.o differ