From 9e6ad7862c7b537f519d58d3bf19fac111f86e85 Mon Sep 17 00:00:00 2001 From: KIX Date: Sat, 15 Nov 2025 03:59:07 -0500 Subject: [PATCH] sort func code --- sort | Bin 0 -> 16704 bytes sort.c | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100755 sort create mode 100644 sort.c diff --git a/sort b/sort new file mode 100755 index 0000000000000000000000000000000000000000..91ec7442d178e5487a05632269716cd0a149926f GIT binary patch literal 16704 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 M*AlZl3LcdH58Cuml>h($ literal 0 HcmV?d00001 diff --git a/sort.c b/sort.c new file mode 100644 index 0000000..63f14da --- /dev/null +++ b/sort.c @@ -0,0 +1,207 @@ +#include +#include +#include +#include +#include + +#include "macro.h" + +typedef void (*sorter_t)(int *arr, size_t sz); + +typedef struct { + const char *name; + sorter_t func; +} sort_info_t; + +/* + * Написать сортировку вставками (не подглядывая в инторнеты!) + * arr -- целочисленный массив + * sz -- размер массива + */ +void insert_sort(int *arr, size_t sz) +{ + int i, j; + for(i = 1; i < sz; i++) + { + int k = arr[i]; + j = i - 1; + while(j >= 0 && arr[j] > k) + { + arr[j + 1] = arr[j]; + j--; + } + arr[j + 1] = k; + } +} + +void +bubble_sort(int *arr, size_t sz) +{ + int i, j; + int tmp; + + for (i = 0; i < sz; i++) { + for (j = i + 1; j < sz; j++) { + if (arr[i] > arr[j]) { + tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + } + } +} + +/* + Функция для слияния двух отсортированных + массивов в один. + + a -- указывает на первый элемент первого массива + b -- указывает на первый элемент второго массива + end -- указывает на первый элемент за границами второго массива + Результат записывается во временный массив tmp. + Первый элемент в tmp[0], второй в tmp[1] и т.д. + + Пример + массивы a = [1, 4, 5] + b = [2, 3, 6] + + a b end + | | | + \/ \/ \/ + | 1 | 4 | 5 | 2 | 3 | 6 | + + после вызова _merge в tmp должен получиться массив + | 1 | 2 | 3 | 4 | 5 | 6 | + + */ +static void +_merge(int *tmp, int *a, int *b, int *end) +{ + int tmp1 = 0, a1 = 0, b1 = 0; + int size_1 = b - a, size_2 = end - b; + while(a1 < size_1 && b1 < size_2) + { + if(a[a1] < b[b1]) + { + tmp[tmp1++] = a[a1++]; + } + else + { + tmp[tmp1++] = b[b1++]; + } + } + while(a1 < size_1) + { + tmp[tmp1] = a[a1]; + tmp1++; a1++; + } + while(b1 < size_2) + { + tmp[tmp1] = b[b1]; + tmp1++; b1++; + } + +} + +static void +_merge_sort_int(int *tmp, int *arr, size_t n) +{ + int half = n / 2; //индекс, который делит массивы пополам + + if (half > 1) + _merge_sort_int(tmp, arr, half); + if (n - half > 1) + _merge_sort_int(tmp + half, arr + half, n - half); + + // "слить" два отсортированных массива в один + //tmp - where new sorted array + _merge(tmp, arr, arr + half, arr + n); + // Скопировать данные из временного хранилища в + // оригинальный массив + memcpy(arr, tmp, n * sizeof(*tmp)); +} + +void +merge_sort(int *arr, size_t sz) +{ + int *tmp; + + if (sz < 2) + return; + tmp = malloc(sizeof(*arr) * sz); + assert(tmp); + _merge_sort_int(tmp, arr, sz); + free(tmp); +} + +void +print_arr(int *arr, size_t n) +{ + printf("{"); + for (int i = 0; i < n; i++) { + printf("%d, ", arr[i]); + } + printf("}\n"); +} + +#define _S(item) {#item, item} + +bool +test_all() +{ + #include "test_arrays.h" + TEST_ARR_INIT(testcases); + + sort_info_t sorters[] = { + _S(insert_sort), + //_S(bubble_sort), + _S(merge_sort), + }; + + int *temparr = NULL; + int temparr_len = 0; + + int allok = 1; + + for (int j = 0; j < ARRSZ(sorters); j++) { + sort_info_t cursort = sorters[j]; + printf("[+] %s\n", cursort.name); + + for (int i = 0; i < ARRSZ(testcases); i++) { + int len = testcases[i].len; + + printf("[+] testing %s\n", testcases[i].name); + if (len > temparr_len) { + // TODO: EER???? + temparr_len = len; + temparr = realloc(temparr, temparr_len * sizeof(*temparr)); + assert(temparr); + } + memcpy(temparr, testcases[i].unsorted, sizeof(*temparr) * len); + cursort.func(temparr, len); + int res = memcmp(temparr, testcases[i].sorted, sizeof(*temparr) * len); + if (res != 0) { + allok = 0; + printf("[-] arrays does not match \n"); + printf("your\n"); + print_arr(temparr, len); + printf("original\n"); + print_arr(testcases[i].sorted, len); + break; + } + } + } + if (allok) { + printf("[+] All OK!\n"); + } + if (temparr) + free(temparr); + return allok == 1; +} + +int +main(int argc, const char *argv[]) +{ + test_all(); + return 0; +}