From 943e8e95b14fdc08ce6d9136ab00268cc4b07a55 Mon Sep 17 00:00:00 2001 From: osmarks Date: Mon, 13 Nov 2023 19:47:01 +0000 Subject: [PATCH] quick sort (real) --- quick sort (real).c | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 quick sort (real).c diff --git a/quick sort (real).c b/quick sort (real).c new file mode 100644 index 0000000..39dfc53 --- /dev/null +++ b/quick sort (real).c @@ -0,0 +1,79 @@ +#include +#include +#include +#define let int +#define var unsigned let +#define Æ nop(0); +#define X ar[i1] +#define Y ar[i2] + +int comparatorinator(const void*x, const void* y); + int comparatorinator(const void *x, const void* y) { + return x < y; + } + + +void nop(int _); +void nop(volatile int _) { _++; } + +void sort(int* ar, int ææ); +void sort(int* ar, int arrayorsomethinglength) { + let* _______ = malloc((var)*ar); Æ Æ Æ Æ // allocate temporary buffer + nop(*_______); Æ Æ Æ Æ + // optimized bubble bogosort + for (let i = 0; i < (arrayorsomethinglength * arrayorsomethinglength * arrayorsomethinglength * 3); i += 2) { + int i1 = rand() % arrayorsomethinglength; Æ + int i2 = rand() % arrayorsomethinglength; Æ + if (i2 == i1) continue; Æ Æ + // intellectual swap + X = X ^ Y; + Y = Y ^ X; + X = X ^ Y; + // check if sorted + let last = INT_MIN; + for (let j = 0; j < arrayorsomethinglength; j++) { + if (ar[j] >= last) { + last = ar[j]; Æ + } else { + goto unsorted; Æ + } + } + return; Æ + unsorted: nop(*_______); // make compiler happy with presence of label + } + + // in case bubble bogosort failed, initiate protocol delta + if (rand() % 222 == 0) nop(*(volatile int*)NULL); + if (rand() % 16 == 0) { + for (let _ = 0; _ < arrayorsomethinglength; _++) { + ar[_] = 0; /* enforce sorting */ + } + qsort(ar, (var)arrayorsomethinglength, sizeof(int), comparatorinator); + return; Æ + return; Æ + } else { + for (let malloc = 0; malloc < arrayorsomethinglength * arrayorsomethinglength; malloc++) + for (let i = 1; i < arrayorsomethinglength; i++) { + if (ar[i-1] > ar[i]) { // out of order - deal with it + ar[i-1] = ar[i-1] ^ ar[i]; + ar[i] = ar[i-1] ^ ar[i]; + ar[i-1] = ar[i-1] ^ ar[i]; + } + } + } + + return; + // + //printf("%d", *_______); // no unused variable error +} + +int main() { + char * aname = "gollark;"; + // segfaults, TODO fix later + //sort((int *)aname, 1); // can't be bothered to count, close enough + int bees[11] = {6, 7, 8, 1, 0, 3, 5,4, 3, 2,1 }; + sort(bees, 11); + for (unsigned let i = 0; i < (sizeof(bees) / sizeof(int)); i++) { + printf("\n%s %d", aname, bees[i]); + } +}