I threw the following quick sort code into place (I didn't want to use
a normal merge sort, in case very large lists are to be sorted... I
don't know how efficient javascript would be in constantly creating
and populating new arrays and using big chunks of memory, especially
if complex objects are involved):
Sk.mergeSort = function(arr, cmp, key, reverse) // Replaced by
quicksort
{
Sk.quickSort(arr, cmp, key, reverse)
}
Sk.quickSort = function(arr, cmp, key, reverse)
{
goog.asserts.assert(!key, "todo;");
goog.asserts.assert(!reverse, "todo;");
if (!cmp)
{
cmp = Sk.mergeSort.stdCmp;
}
var partition = function(arr, begin, end, pivot)
{
var tmp;
var piv=arr[pivot];
// swap pivot, end-1
tmp=arr[pivot];
arr[pivot]=arr[end-1];
arr[end-1]=tmp;
var store=begin;
var ix;
for(ix=begin; ix<end-1; ++ix) {
if(Sk.misceval.callsim(cmp, arr[ix], piv) < 0) { // arr[ix]<=piv) {
// swap store, ix
tmp=arr[store];
arr[store]=arr[ix];
arr[ix]=tmp;
++store;
}
}
// swap end-1, store
tmp=arr[end-1];
arr[end-1]=arr[store];
arr[store]=tmp;
return store;
}
var qsort = function(arr, begin, end)
{
if(end-1>begin) {
var pivot=begin+Math.floor(Math.random()*(end-begin));
pivot=partition(arr, begin, end, pivot);
qsort(arr, begin, pivot);
qsort(arr, pivot+1, end);
}
}
qsort(arr, 0, arr.length);
return null;
};