Thread overview
Multisort
Jul 06, 2008
dsimcha
Jul 06, 2008
bearophile
Jul 06, 2008
superdan
July 06, 2008
I've been working on implementing some statistics functions in D, and noticed that it would be nice if a multisort function were in Phobos.  Such a function would take N arrays in and sort them by the first one.  The common way to handle something like this seems to be to make a struct with the fields, make opCmp point to whatever field you want to sort by, and then use a regular sorting algorithm.  This is slow and a pain.  I've implemented a few different multisort functions, along with documentation and unit testing, and would like to contribute them to Phobos.  I've attached the source file and the Ddoc documentation.
July 06, 2008
I haven't tried your code (yet), but I suggest you to not use too much long lines (90-100 chars is probably enough).

Your code contains both the forms:
    foreach(ti, array; data) temp[ti][index] = array[$-1];
    ...
    foreach(i, array; temp) {
        data[i][0..$] = array[0..$];
    }

I suggest you to use the second form, or the following one if you want to save a line:
    foreach (i, array; temp)
        data[i][0..$] = array[0..$];

I suggest you to avoid writing a single large unittest, but to add one block of unittests under each function/class/method, so you can isolate them better, disable them, etc (even better is having a standard way to give them a name, so the program/compiler that executes the unit tests knows what function/class/method are broken. D unittest system needs just small improvements to become good enough for small/medium size programs).

Bye,
bearophile
July 06, 2008
dsimcha Wrote:

> I've been working on implementing some statistics functions in D, and noticed that it would be nice if a multisort function were in Phobos.  Such a function would take N arrays in and sort them by the first one.  The common way to handle something like this seems to be to make a struct with the fields, make opCmp point to whatever field you want to sort by, and then use a regular sorting algorithm.  This is slow and a pain.  I've implemented a few different multisort functions, along with documentation and unit testing, and would like to contribute them to Phobos.  I've attached the source file and the Ddoc documentation.

yarp i needed this 2. sounds good but it's unnecessary. sort does all that shit easily.

int[] arr1;
float[] arr2;
string[] arr3;
// sort three arrays as one
void mySwap(int* a, int* b)
{
    auto i = a - arr1.ptr, j = b - arr1.ptr;
    iterSwap(a, b);
    swap(arr2[i], arr2[j]);
    swap(arr3[i], arr3[j]);
}
sort!("a < b", SwapStrategy.unstable, mySwap)(arr1);

what happens is that whenever two doods in arr1 get swapped, the corresponding doods in arr2 and arr3 get swapped too. i don't know why the docs don't give such examples. there's just a hint "Possible uses include notifying observers, counting the number of operations, or manipulating multiple collections in lockstep." the lockstep thing gave it away.

& of course you deserve shoe heel beating for putting bubblesort in there. no matter how much you warn against its usage.