diff options
| author | Tyge Lovset <[email protected]> | 2023-05-18 11:49:31 +0200 |
|---|---|---|
| committer | Tyge Lovset <[email protected]> | 2023-05-18 11:49:31 +0200 |
| commit | 50a16934dde8e65bbcf628d6342c1649f7e09365 (patch) | |
| tree | a14f3347622979858ff60b95630877029cb46ef6 /include/stc/algo | |
| parent | be7d9913d4a284bdeb7f0431482b5731b5ef31df (diff) | |
| download | STC-modified-50a16934dde8e65bbcf628d6342c1649f7e09365.tar.gz STC-modified-50a16934dde8e65bbcf628d6342c1649f7e09365.zip | |
Huge update: cqueue and cdeq completely rewritten. cvec and cdeq API harmonized. Docs update/improved.
Diffstat (limited to 'include/stc/algo')
| -rw-r--r-- | include/stc/algo/sort.h (renamed from include/stc/algo/csort.h) | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/include/stc/algo/csort.h b/include/stc/algo/sort.h index e01a2893..20b7e1b3 100644 --- a/include/stc/algo/csort.h +++ b/include/stc/algo/sort.h @@ -24,17 +24,17 @@ template params: #define i_val - value type [required] #define i_less - less function. default: *x < *y -#define i_tag NAME - define csort_NAME(). default {i_val} +#define i_tag name - define namearray_qsort(). i_tag defaults {i_val} // test: #include <stdio.h> #define i_val int -#include <stc/algo/csort.h> +#include <stc/algo/sort.h> int main() { int arr[] = {23, 321, 5434, 25, 245, 1, 654, 33, 543, 21}; - csort_int(arr, c_arraylen(arr)); + intarray_qsort(arr, c_arraylen(arr)); for (int i = 0; i < c_arraylen(arr); i++) printf(" %d", arr[i]); @@ -42,33 +42,42 @@ int main() { } */ #include "../ccommon.h" -#define _i_prefix csort_ +#ifndef i_type + #define i_at(arr, idx) (&arr[idx]) + #ifndef i_tag + #define i_tag i_val + #endif + #define i_type c_PASTE(i_tag, array) + typedef i_val i_type; +#endif +#ifndef i_at + #define i_at(arr, idx) _cx_memb(_at_mut)(arr, idx) +#endif #include "../priv/template.h" -typedef i_val _cx_value; -static inline void _cx_memb(_insertion)(i_val arr[], intptr_t lo, intptr_t hi) { +static inline void _cx_memb(_insertsort_ij)(_cx_self* arr, intptr_t lo, intptr_t hi) { for (intptr_t j = lo, i = lo + 1; i <= hi; j = i, ++i) { - i_val key = arr[i]; - while (j >= 0 && (i_less((&key), (&arr[j])))) { - arr[j + 1] = arr[j]; + i_val key = *i_at(arr, i); + while (j >= 0 && (i_less((&key), i_at(arr, j)))) { + *i_at(arr, j + 1) = *i_at(arr, j); --j; } - arr[j + 1] = key; + *i_at(arr, j + 1) = key; } } -static inline void _cx_memb(_quicksort)(i_val arr[], intptr_t lo, intptr_t hi) { +static inline void _cx_memb(_sort_ij)(_cx_self* arr, intptr_t lo, intptr_t hi) { intptr_t i = lo, j; while (lo < hi) { - i_val pivot = arr[lo + (hi - lo)*7/16]; + i_val pivot = *i_at(arr, lo + (hi - lo)*7/16); j = hi; while (i <= j) { - while (i_less((&arr[i]), (&pivot))) ++i; - while (i_less((&pivot), (&arr[j]))) --j; + while (i_less(i_at(arr, i), (&pivot))) ++i; + while (i_less((&pivot), i_at(arr, j))) --j; if (i <= j) { - c_swap(i_val, arr+i, arr+j); + c_swap(i_val, i_at(arr, i), i_at(arr, j)); ++i; --j; } } @@ -77,13 +86,15 @@ static inline void _cx_memb(_quicksort)(i_val arr[], intptr_t lo, intptr_t hi) { c_swap(intptr_t, &hi, &j); } - if (j - lo > 64) _cx_memb(_quicksort)(arr, lo, j); - else if (j > lo) _cx_memb(_insertion)(arr, lo, j); + if (j - lo > 64) _cx_memb(_sort_ij)(arr, lo, j); + else if (j > lo) _cx_memb(_insertsort_ij)(arr, lo, j); lo = i; } } -static inline void _cx_self(i_val arr[], intptr_t n) - { _cx_memb(_quicksort)(arr, 0, n - 1); } +static inline void _cx_memb(_sort_n)(_cx_self* arr, intptr_t len) { + _cx_memb(_sort_ij)(arr, 0, len - 1); +} #include "../priv/template2.h" +#undef i_at |
