Sorting an Array
torhu
fake at address.dude
Wed Jul 11 16:27:41 PDT 2007
torhu wrote:
> okibi wrote:
>> This does seem like the best way, but I'm not sure how I would go about implement Quicksort into that code. Could you please give me some pointers?
>
> I often use C's quicksort, found in std.c.stdlib.
>
> void sort(T)(T[] array, bool function(T a, T b) compare) {
>
> // wrap compare in a C function
> static extern(C) int cmp(void* a, void* b) {
> return compare(*cast(T*)a, *cast(T*)b);
> }
>
> qsort(array.ptr, array.length, array[0].sizeof, &cmp);
> }
>
> compare has to return a negative number if a is smaller, positive is b
> is smaller, or zero if they are equal.
Someone pointed out that this example doesn't work, since cmp can't
access sort's arguments directly. So I had to fix it. cmp could
obviously call compare through a local, static pointer, but for
performance reasons I made qsort call the comparison function directly.
A quick test showed that this matters a whole lot in this case.
This code is tested, no worries.
---
import std.c.stdlib;
import std.stdio;
extern (C) void sort(T)(T[] array, int function(T* a, T* b) compare)
{
alias extern (C) int function (void* a, void* b) ftype;
qsort(array.ptr, array.length, array[0].sizeof, cast(ftype)compare);
}
extern(C) int compareInts(int* a, int* b) {
return *a - *b;
}
void main()
{
int[] a = [3, 14, 1];
a.sort(&compareInts);
writefln(a); // prints '[1,3,14]'
}
---
More information about the Digitalmars-d-learn
mailing list