配列の関数にsortOn(key)という関数がある。配列に入ったオブジェクトのkeyプロパティをキーにして整列をしてくれる非常に便利なものです。 しかし、keyを文字列として整列する上に、安定ではないのが難有りです。 数字を文字列として扱うので、桁数に注意しないといけない。 安定ではないというのは、上のサンプルでいうとBとEとFのpriceが10で同じなので、priceでsortOnすると、BとEとFが頭に来る。さらに現在の並びを保持してB、E、F・・・、となるはずなのだけど、順番がおかしくなる場合がある。数値が同じ者同士の並びはどうでもいいや、って感じならそれでいいんだけど、気持ちが悪い。 いくつかある安定なソートのアルゴリズムでは、マージソートが早いらしいので配列の関数として作ってみた。
var buff_array = new Array();
sort(this, start, end, key, buff_array);
function sort(data_array, start, end, key, buff_array) {
if (start>=end) {
return;
}
var mid = Math.floor*1 {
if (buff_array[j][key]<=data_array[i][key]) {
data_array[k++] = buff_array[j++];
} else {
data_array[k++] = data_array[i++];
}
}
while (j<p) {
data_array[k++] = buff_array[j++];
}
}
};
hoge_array.mergeSort(開始点,終了点, "キー")でソートできる。 通常は、開始と終了に0とlengthを使えばよい。
*1:start+end)/2);
sort(data_array, start, mid, key, buff_array);
sort(data_array, mid+1, end, key, buff_array);
var p = 0;
for (i=start; i<=mid; i++) {
buff_array[p++] = data_array[i];
}
var i = mid+1;
var j = 0;
var k = start;
while ((i<=end) && (j<p