Compare commits

...

2 Commits

Author SHA1 Message Date
b6b2500944 add missed radix sort tests 2026-05-06 05:47:11 -05:00
9b56a240d1 radix sort pog 2026-05-06 05:46:50 -05:00
8 changed files with 193 additions and 13 deletions

View File

@@ -18,10 +18,12 @@ INCLUDE_INSTALL_PATH := /usr/local/include/lsort
LIB_INSTALL_PATH := /usr/local/lib LIB_INSTALL_PATH := /usr/local/lib
STATIC_BUILD_FILES := $(STATIC_BUILD_DIR)/lsort.o \ STATIC_BUILD_FILES := $(STATIC_BUILD_DIR)/lsort.o \
$(STATIC_BUILD_DIR)/types.o $(STATIC_BUILD_DIR)/types.o \
$(STATIC_BUILD_DIR)/radix.o
DYNAMIC_BUILD_FILES := $(DYNAMIC_BUILD_DIR)/lsort.o \ DYNAMIC_BUILD_FILES := $(DYNAMIC_BUILD_DIR)/lsort.o \
$(STATIC_BUILD_DIR)/types.o $(STATIC_BUILD_DIR)/types.o \
$(STATIC_BUILD_DIR)/radix.o
TEST_BUILD_FILES := $(TEST_BUILD_DIR)/test.o \ TEST_BUILD_FILES := $(TEST_BUILD_DIR)/test.o \

View File

@@ -1,6 +1,8 @@
#ifndef LSORT_H #ifndef LSORT_H
#define LSORT_H #define LSORT_H
#include "types.h"
int check_sorted(lsort_array_i* array);
#endif #endif

8
include/radix.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef LSORT_RADIX_H
#define LSORT_RADIX_H
#include "types.h"
int lsort_radix(lsort_array_i* array, lsort_array_i* return_array);
#endif

View File

@@ -15,20 +15,24 @@ typedef struct {
int* items; int* items;
} lsort_array_i; } lsort_array_i;
lsort_array_i* lsort_create_int_array();
lsort_array_i* lsort_array_i_create();
void lsort_array_i_destroy(lsort_array_i* array);
void lsort_array_i_append(lsort_array_i* array, int number); void lsort_array_i_append(lsort_array_i* array, int number);
int lsort_array_i_swap(lsort_array_i* array, int indexA, int indexB); int lsort_array_i_swap(lsort_array_i* array, int indexA, int indexB);
void lsort_array_i_print(lsort_array_i* array);
typedef struct { typedef struct {
size_t count; size_t count;
size_t capacity; size_t capacity;
lsort_array_i** items; lsort_array_i** items;
} lsort_array_i_array; } lsort_array_i_array;
// struct lsort_int_link { void lsort_array_i_array_append(lsort_array_i_array* array, lsort_array_i* item);
// int value; void lsort_array_i_array_destroy(lsort_array_i_array* array);
// lsort_array_i* next;
// };
#endif #endif

11
lsort.c
View File

@@ -1,5 +1,12 @@
#include "./include/lsort.h" #include "./include/lsort.h"
int add(int x, int y) { int check_sorted(lsort_array_i* array) {
return x + y; if (array->count <= 0) return 2;
for (int i = 0; i < array->count - 1; i++) {
if (array->items[i] > array->items[i + 1]) {
return 1;
};
}
return 0;
} }

79
radix.c Normal file
View File

@@ -0,0 +1,79 @@
#include "include/types.h"
#include "include/radix.h"
int _seperate_pos_neg(lsort_array_i* array, lsort_array_i* pos_array, lsort_array_i* neg_array) {
for (int i = 0; i < array->count; i++) {
if ((0x80000000 & array->items[i]) == 0x80000000) {
lsort_array_i_append(neg_array, array->items[i]);
} else {
lsort_array_i_append(pos_array, array->items[i]);
}
}
return 0;
}
int _sort_items(lsort_array_i* numbers, lsort_array_i_array* buckets) {
int byte_check = 0x0000000F;
for (int i = 0; i < 8; i++) {
// Loop through the list of numbers and append them to their respective buckets for this 4-byte chunk
for (int item_index = 0; item_index < numbers->count; item_index++) {
int* current_number = &numbers->items[item_index];
lsort_array_i* bucket = buckets->items[(*current_number >> (i * 4)) & byte_check];
lsort_array_i_append(bucket, *current_number);
}
numbers->count = 0;
// Add the bucketed numbers back to the original array after emptying it
for (int bucket_number = 0; bucket_number < buckets->count; bucket_number++) {
lsort_array_i* bucket = buckets->items[bucket_number];
for (int bucket_item = 0; bucket_item < bucket->count; bucket_item++) {
lsort_array_i_append(numbers, bucket->items[bucket_item]);
}
bucket->count = 0;
}
// Repeat for each 4-byte chunk...
}
return 0;
}
int lsort_radix(lsort_array_i* array, lsort_array_i* return_array) {
if (array->count <= 0) return 1;
// Seperate positive and negative numbers
lsort_array_i positive_numbers = {0};
lsort_array_i negative_numbers = {0};
if (_seperate_pos_neg(array, &positive_numbers, &negative_numbers)) return 2;
// Create buckets
lsort_array_i_array buckets = {0};
for (int i = 0; i < 16; i++) {
lsort_array_i* bucket = lsort_array_i_create();
lsort_array_i_array_append(&buckets, bucket);
}
// Sort each set of numbers using those buckets
_sort_items(&negative_numbers, &buckets);
_sort_items(&positive_numbers, &buckets);
// Add each array of numbers to the return array
for (int i = 0; i < negative_numbers.count; i++) {
lsort_array_i_append(return_array, negative_numbers.items[i]);
}
for (int i = 0; i < positive_numbers.count; i++) {
lsort_array_i_append(return_array, positive_numbers.items[i]);
}
// Destroy the buckets
lsort_array_i_array_destroy(&buckets);
return 0;
}

View File

@@ -1,4 +1,7 @@
#include "../include/types.h" #include "../include/types.h"
#include "../include/radix.h"
#include "../include/lsort.h"
#include <stdio.h>
int test_array_i_append(lsort_array_i* array) { int test_array_i_append(lsort_array_i* array) {
@@ -24,11 +27,54 @@ int test_array_i_swap(lsort_array_i* array) {
return 0; return 0;
} }
int main(void) { int test_append_swap() {
lsort_array_i array = {0}; lsort_array_i array_append_swap = {0};
if (test_array_i_append(&array)) return 1; if (test_array_i_append(&array_append_swap)) return 1;
if (test_array_i_swap(&array)) return 2; if (test_array_i_swap(&array_append_swap)) return 1;
lsort_array_i array_sort_check = {0};
lsort_array_i_append(&array_sort_check, 1);
lsort_array_i_append(&array_sort_check, 5);
lsort_array_i_append(&array_sort_check, 7);
lsort_array_i_append(&array_sort_check, 8);
lsort_array_i_append(&array_sort_check, 15);
lsort_array_i_append(&array_sort_check, 28);
if (check_sorted(&array_sort_check) == 1) return 1;
lsort_array_i_swap(&array_sort_check, 2, 4);
lsort_array_i_swap(&array_sort_check, 0, 3);
if (check_sorted(&array_sort_check) == 0) return 1;
return 0; return 0;
} }
int test_radix_sort() {
lsort_array_i array_radix = {0};
lsort_array_i_append(&array_radix, -2);
lsort_array_i_append(&array_radix, -15);
lsort_array_i_append(&array_radix, 25);
lsort_array_i_append(&array_radix, 56);
lsort_array_i_append(&array_radix, 23);
lsort_array_i_append(&array_radix, -222);
lsort_array_i_append(&array_radix, -58);
lsort_array_i array_radix_return = {0};
lsort_radix(&array_radix, &array_radix_return);
if (check_sorted(&array_radix_return) != 0) return 1;
return 0;
}
int main(void) {
if (
test_append_swap() ||
test_radix_sort()
) return 1;
printf("Test completed successfully.\n");
return 0;
}

32
types.c
View File

@@ -1,5 +1,14 @@
#include "include/types.h" #include "include/types.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
lsort_array_i* lsort_array_i_create() {
return calloc(1, sizeof(lsort_array_i));
}
void lsort_array_i_destroy(lsort_array_i* array) {
free(array);
}
void lsort_array_i_append(lsort_array_i* array, int item) { void lsort_array_i_append(lsort_array_i* array, int item) {
if (array->count >= array->capacity) { if (array->count >= array->capacity) {
@@ -19,3 +28,26 @@ int lsort_array_i_swap(lsort_array_i* array, int indexA, int indexB) {
return 0; return 0;
} }
void lsort_array_i_print(lsort_array_i* array) {
for (int i = 0; i < array->count; i++) {
printf("%d ", array->items[i]);
}
printf("\n");
}
void lsort_array_i_array_append(lsort_array_i_array* array, lsort_array_i* item) {
if (array->count >= array->capacity) {
if (array->capacity == 0) array->capacity = 8;
else array->capacity *= 2;
array->items = realloc(array->items, array->capacity * sizeof(*array->items));
}
array->items[array->count++] = item;
}
void lsort_array_i_array_destroy(lsort_array_i_array* array) {
for (int array_number = 0; array_number < array->count; array_number++) {
lsort_array_i_destroy(array->items[array_number]);
}
}