我想分享一個我在C/C+中經(jīng)常使用的技巧qsort()
.
JS的SORT()允許指定一個比較函數(shù)。創(chuàng)建第二個長度相同的數(shù)組,并使用從0增加的數(shù)字填充它。
function stableSorted(array, compareFunction) {
compareFunction = compareFunction || defaultCompare;
var indicies = new Array(array.length);
for (var i = 0; i < indicies.length; i++)
indicies[i] = i;
這是原始數(shù)組的索引。我們將對第二個數(shù)組進(jìn)行排序。建立一個自定義比較函數(shù)。
indicies.sort(function(a, b)) {
它將從第二個數(shù)組中獲取這兩個元素:將它們用作原始數(shù)組的索引,并比較這些元素。
var aValue = array[a], bValue = array[b];
var order = compareFunction(a, b);
if (order != 0)
return order;
如果元素恰好相等,那么比較它們的索引以使順序穩(wěn)定。
if (a < b)
return -1;
else
return 1;
});
在SORT()之后,第二個數(shù)組將包含索引,您可以使用這些索引以穩(wěn)定的排序順序訪問原始數(shù)組的元素。
var sorted = new Array(array.length);
for (var i = 0; i < sorted.length; i++)
sorted[i] = array[indicies[i]];
return sorted;}// The default comparison logic used by Array.sort(), if compareFunction is not provided:function defaultCompare(a, b) {
a = String(a);
b = String(b);
if (a < b) return -1;
else if (a > b) return 1;
else return 0;}
一般來說,穩(wěn)定的排序算法僅僅是成熟的,與好的ol‘qSort相比,仍然需要更多的額外內(nèi)存。我想這就是為什么很少有規(guī)格要求穩(wěn)定排序。