On Wednesday, 17 July 2013 at 13:12:18 UTC, Joseph Rushton
Wakeling wrote:
On 07/17/2013 02:42 PM, bearophile wrote:
You need a lambda delegate for that. But I forgot about
multisort algorithm...
It's probably the right tool.
So, in the end I tried out 3 different alternatives:
schwartzSort(a => tuple(arr1[a], arr2[a]), "a < b")
sort((a, b) => arr1[a] < arr1[b] || (arr1[a] == arr1[b] &&
arr2[a] < arr2[b]))
multiSort((a, b) => arr1[a] < arr1[b], (a, b) => arr2[a] <
arr2[b])
sort() seems faster than schwartzSort for smaller-scale stuff,
but takes longer
for larger-scale sorts. multiSort wins out over both of them.
I guess in principle it might be possible to have a
multiSchwartzSort which
allows for multiple transformations:
multiSchwartzSort(a => arr1[a], a => arr2[a], "a < b", "a <
b")
... which might gain some speed by caching the results of the
transformations,
as schwartzSort is supposed to do?
But anyway, I think this solution works at limited extra cost
speed-wise. :-)
Thanks very much to both of you!
schwartzSort should really only be used if the transformation
function is expensive. For example, if you want to sort 3D dots
according to their norm.
In your case, your transformation function (a => arr1[a]) isn't
expensive. So a straight up (multi)sort should be preferred over
schwartzSort.