....
and you can use Sort::Maker (fresh on CPAN) to generate that for you
from a clean specification of the sort.
Uri -- did you ever get a look at the vast-speedup
to quicksort, discovered by Sedgewick, that I saw at
a talk and later mentioned to you?
Anyway, I happened to just run across it again,
with implementation, makefile, etc, and thought
you might be interested (given your interest in sorting).
Perhaps if you think worth while, you could forward
this addr, etc, to Randal and Damian and to the
guys working on P6.
Here's the lynx-output for the home-page of the sort-place:
A library of internal sorting routines
Ariel Faigon
________________________________________________________________
Keywords:
insertion sort, shellsort, radixsort, heapsort, quicksort,
quickersort, sedgesort (Robert Sedgewick quicksort
optimization)
This is a collection of sorting algorithms, in C. All the examples
are thoroughly tested using random input generation and
assertions, there are no known bugs. I've been using these,
especially the fastest ``sedgesort'', in production code.
The source of these algorithms are classic algorithm and C texts
which I most highly recommended, with minor modifications I made
over time:
* [1]Robert Sedgewick: Algorithms in C:
[2]Fundamentals, Data Structures, Sorting, Searching
* [3]Jon Louis Bentley: Programming Pearls
* [4]Kernighan & Ritchie: The C Programming Language
All the sorting routines are internal sorts, they assume your data
is in memory. When sorting big arrays that do not fit in memory on
virtual memory systems, performance may suffer significantly.
Certain current implementations of sorting in C++ standard
libraries like STL (the HP/SGI Standard Template Library which is
now a part of the GNU free software collection) are comparable in
speed to ``sedgesort''. Note however that the general C/Unix
``qsort'' routine is much slower due to its generality (e.g.
element compare is done via an indirect function call passed as a
function pointer.)
You may use this collection to trade generality for performance
and for instructional purposes.
_____________________________________________________________
You may [5]download the whole sort library or browse the
individual files below.
Here are some brief descriptions of the sort library source files:
[6]Makefile
Simple makefile to build the library sort.a and the test
program sorttest.
[7]sort.h
Header file. defines the key_t type, the type of the items we
are sorting, macros for key-comparisons: GT (greater than), LT
(less than), GE (greater or equal), LE (less or equal). SWAP
macro to swap elements in the array. Macros are used instead
of a compare function for speed. You may define all the above
to your liking and recompile the library.
[8]insort.c
Insertion sort. Most efficient for small arrays (about 15
elements or less). For greater arrays, use one of the
O(n*log(n)) methods. If you have small arrays, use this. Other
methods are an overkill, and are not faster.
[9]shellsort.c
Shell Sort. More efficient than insertion sort for arrays
larger than about 15 elements, but less efficient than the
O(n*log(n)) methods. Average time is K*O(n**1.2)
[10]gamasort.c
A radix sort based on bits in the binary representation of the
sorted numbers. Contributed by José Gama. Gamasort will work
only on unsigned integers in 2-complement representation. Thus
it is less general than the other methods, it also has a
relatively high complexity factor. On the positive side this
is an O(n*log(n)) algorithm in which the 'n' is proportional
to the largest number in the sorted array so it scales well to
the cases where the array is very big but the numbers in it
are relatively small like a million element array containing
unsigned bytes.
[11]quicksort.c
quicksort. Invented by C.A.R. Hoare. Very good average time
K*n*log(n), where the constant K is very small. but worst case
is bad: O(n*n). See, sedgesort for an impressive improvement.
^^^^^^^^^^
[12]quickersort.c
An optimization of quicksort. Use a sentinel containing
MAXINT, to make the constant K even smaller. This is similar
to the qsort libc function, but without the (*compar)() call
penalty.
[13]sedgesort.c
Robert Sedgewick optimization. Use partial quickersort with a
sentinel to reach a partial order, leave the unsorted segments
of length == CUTOFF unsorted. Then apply a simpler one-pass
low-overhead insertion sort on the whole array to reach
complete order. This method was found empirically to be one of
the fastest sorting methods in practice. If you don't believe
it, try to beat it. Note, in big arrays, worst cases are rare
in big arrays, so to keep the overhead to minimum, this sort
does not try to avoid worst cases (e.g. using median of three
to select a pivot).
[14]heapsort.c
Heap sort. This is on the average, slower than quicksort. But
is has the advantage that it worst case is still O(n*log(n))
Like quicksort, and other methods that pick far elements at
random to exchange it is not stable: elements of the same
magnitude, might change relative order. This is a relatively
optimized version of heapsort which minimizes neighboring
elements exchanges in the innermost loop, using an insertion
strategy (first find final location, only then exchange).
Lastly, if you want only the top N elements out of M elements,
(kinda priority queue) heap sort is the way to go; just create
a heap, then sift N times.
Auxilliary test routines:
+ [15]sorttest.c: Program containing main() to test the sort
library sort.a.
+ [16]bstest.c: Program containing main() to test the binary
search routine that is included here as well.
+ [17]sorted.c: Test routine to verify that an array is
sorted.
_____________________________________________________________
Feedback to:
Antispam Coalition
________________________________________________________________
If you used this, and found it useful, please let me know.
I'd be more inclined to enrich this collection if I know people find
it useful.
References
5.
http://www.yendor.com/programming/sort/sort-all.tgz
6.
http://www.yendor.com/programming/sort/Makefile
7.
http://www.yendor.com/programming/sort/sort.h
8.
http://www.yendor.com/programming/sort/insort.c
9.
http://www.yendor.com/programming/sort/shellsort.c
10.
http://www.yendor.com/programming/sort/gamasort.c
11.
http://www.yendor.com/programming/sort/quicksort.c
12.
http://www.yendor.com/programming/sort/quickersort.c
13.
http://www.yendor.com/programming/sort/sedgesort.c
14.
http://www.yendor.com/programming/sort/heapsort.c
15.
http://www.yendor.com/programming/sort/sorttest.c
16.
http://www.yendor.com/programming/sort/bstest.c
17.
http://www.yendor.com/programming/sort/sorted.c
Hope this is useful to *someone*!
David