summaryrefslogtreecommitdiff
path: root/src/stdlib/qsort.c
AgeCommit message (Collapse)AuthorLines
2021-09-23add qsort_r and make qsort a wrapper around itÉrico Nogueira-17/+20
we make qsort a wrapper by providing a wrapper_cmp function that uses the extra argument as a function pointer. should be optimized to a tail call on most architectures, as long as it's built with -fomit-frame-pointer, so the performance impact should be minimal. to keep the git history clean, for now qsort_r is implemented in qsort.c and qsort is implemented in qsort_nr.c. qsort.c also received a few trivial cleanups, including replacing (*cmp)() calls with cmp(). qsort_nr.c contains only wrapper_cmp and qsort as a qsort_r wrapper itself.
2017-08-11qsort: add a short comment about the algorithmLeah Neukirchen-0/+3
2011-04-29avoid crashing when nel==0 is passed to qsortRich Felker-2/+6
2011-04-27replace heap sort with smoothsort implementation by Valentin OchsRich Felker-32/+193
Smoothsort is an adaptive variant of heapsort. This version was written by Valentin Ochs (apo) specifically for inclusion in musl. I worked with him to get it working in O(1) memory usage even with giant array element widths, and to optimize it heavily for size and speed. It's still roughly 4 times as large as the old heap sort implementation, but roughly 20 times faster given an almost-sorted array of 1M elements (20 being the base-2 log of 1M), i.e. it really does reduce O(n log n) to O(n) in the mostly-sorted case. It's still somewhat slower than glibc's Introsort for random input, but now considerably faster than glibc when the input is already sorted, or mostly sorted.
2011-02-17don't compare elements with themselves during qsort.Rich Felker-1/+1
this is actually a workaround for a bug in gcc, whereby it asserts inequality of the keys being compared...
2011-02-12initial check-in, version 0.5.0v0.5.0Rich Felker-0/+50