マージソート

配列の関数にsortOn(key)という関数がある。配列に入ったオブジェクトのkeyプロパティをキーにして整列をしてくれる非常に便利なものです。 しかし、keyを文字列として整列する上に、安定ではないのが難有りです。 数字を文字列として扱うので、桁数に注意しないといけない。 安定ではないというのは、上のサンプルでいうとBとEとFのpriceが10で同じなので、priceでsortOnすると、BとEとFが頭に来る。さらに現在の並びを保持してB、E、F・・・、となるはずなのだけど、順番がおかしくなる場合がある。数値が同じ者同士の並びはどうでもいいや、って感じならそれでいいんだけど、気持ちが悪い。 いくつかある安定なソートのアルゴリズムでは、マージソートが早いらしいので配列の関数として作ってみた。

Array.prototype.mergeSort = function(start, end, key) {
    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