From 4056cf92937fa6a0460d16b5cb8d5398cd2503b8 Mon Sep 17 00:00:00 2001 From: mossfet Date: Fri, 31 Mar 2023 12:27:08 +0100 Subject: [PATCH] First commit --- .gitignore | 1 + main.c | 17 +++++++++ priority_queue.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ priority_queue.h | 27 +++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 .gitignore create mode 100644 main.c create mode 100644 priority_queue.c create mode 100644 priority_queue.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cba7efc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +a.out diff --git a/main.c b/main.c new file mode 100644 index 0000000..1eafaf7 --- /dev/null +++ b/main.c @@ -0,0 +1,17 @@ +#include +#include +#include "priority_queue.h" +int main (int argc, char** argv) { + PriorityQueue priority_queue = { (int*)calloc(10, sizeof(int)), 0, 5}; + int i = 0; + while (true) { + insert(&priority_queue, i); + if (i % 100000 == 0) { + printf("%i\n", i); + } + i++; + } + return 0; +} + + diff --git a/priority_queue.c b/priority_queue.c new file mode 100644 index 0000000..fd8c131 --- /dev/null +++ b/priority_queue.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include + +#include "priority_queue.h" + +void insert(PriorityQueue *priority_queue, int item) { + if (priority_queue->max_item == priority_queue->size - 1) { + printf("Reallocating from %i to %i!\n", priority_queue->size, priority_queue->size*2); + priority_queue->array = realloc(priority_queue->array, priority_queue->size*2*sizeof(int)); + if (priority_queue->array == NULL) { + printf("That's a null pointer!\n"); + } + priority_queue->size *= 2; + } + priority_queue->array[priority_queue->max_item] = item; + bubble_up(priority_queue, priority_queue->max_item); + priority_queue->max_item++; +} + +int extract (PriorityQueue *priority_queue) { + int item = priority_queue->array[0]; + priority_queue->array[0] = priority_queue->array[priority_queue->max_item - 1]; + bubble_down(priority_queue, 0); + return item; +} + +size_t parent (size_t index) { + return (index-1)/2; +} + +size_t l_child (size_t index) { + return (2*index)+1; +} + +size_t r_child (size_t index) { + return (2*index)+2; +} + +void bubble_up (PriorityQueue *priority_queue, size_t index) { + if (index == 0) { + return; + } + if (compare(priority_queue, index, parent(index))) { + swap_parent(priority_queue, index); + bubble_up (priority_queue, parent(index)); + } +} + +void bubble_down (PriorityQueue *priority_queue, size_t index) { + size_t min = index; + size_t left = l_child (index); + size_t right = r_child (index); + size_t max_item = priority_queue->max_item; + + if (left < max_item && compare(priority_queue, left, index)) { + min = left; + } + + if (right < max_item && compare(priority_queue, right, min)) { + min = right; + } + + if (min != index) { + swap_parent(priority_queue, min); + bubble_down(priority_queue, min); + } +} + +void print_queue (PriorityQueue *priority_queue) { + for (int i = 0; i < priority_queue->size; i++) { + printf("%i\n", priority_queue->array[i]); + } +} + +void swap_parent (PriorityQueue *priority_queue, size_t lower_index) { + int temp = priority_queue->array[lower_index]; + priority_queue->array[lower_index] = priority_queue->array[parent(lower_index)]; + priority_queue->array[parent(lower_index)] = temp; +} + +bool compare (PriorityQueue *priority_queue, size_t first_index, size_t second_index) { + if (priority_queue->array[first_index] < priority_queue->array[second_index]) { + return true; + } else { + return false; + } +} diff --git a/priority_queue.h b/priority_queue.h new file mode 100644 index 0000000..8422304 --- /dev/null +++ b/priority_queue.h @@ -0,0 +1,27 @@ +#include +struct PriorityQueue { + int* array; + // The NEXT item to be added + size_t max_item; + size_t size; +}; + +typedef struct PriorityQueue PriorityQueue; + +void insert(PriorityQueue *priority_queue, int item); + +int extract (PriorityQueue *priority_queue); + +size_t parent (size_t index); +size_t l_child (size_t index); +size_t r_child (size_t index); + +void bubble_up (PriorityQueue *priority_queue, size_t index); + +void bubble_down (PriorityQueue *priority_queue, size_t index); + +void print_queue (PriorityQueue *priority_queue); + +void swap_parent (PriorityQueue *priority_queue, size_t lower_index); + +bool compare (PriorityQueue *priority_queue, size_t first_index, size_t second_index);