tmlib.js で様々なソートをビジュアル化してみた

phiary に引っ越しました. 毎日プログラミングやWebに関する情報を発信しています! RSS 登録してたまに覗いたり, tweet やハテブして拡散してもらえると幸いです.

visual-sort

Pocket

昔作ってた visual sort を tmlib.js で作りなおしてみました.

色々なソートをビジュアル化してます. ビジュアル的にソートの流れが分かるよん♪

個人的には bidirectionalBubbleSort が好き♪♪

jsdo.it で作っているので, 気軽に実行できます. まだまだ色々なソートがあるので fork して実装してくれると凄く嬉しいです.

Sample Demo

Check out this Pen!

bubbleSort

/**
 * バブルソート
 */
var bubbleSort = function(list)
{
    var sortProcess = [];
    var len = list.length;
    
    for (var i=0; ii; --j) {
            // 交換
            if (list[j] < list[j-1]) {
                list.swap(j, j-1);
                // 過程を記録
                sortProcess.push(list.clone());
            }
        }
    }
    
    return sortProcess;
};

bidirectionalBubbleSort

var bidirectionalBubbleSort = function(list)
{
    var sortProcess = [];
        
    var start   = -1;
    var end     = list.length;
    var flag = 0;
    
    while (start list[i+1]) {
                list.swap(i, i+1);
                flag |= 1;
            }
            // 過程を記録
            sortProcess.push(list.clone());
        }
        if (!flag) break;
        
        flag = 0; 
        for (var i=end; i>=start; --i) {
            if (list[i] > list[i+1]) {
                list.swap(i, i+1);
                flag |= 1;
            }
            // 過程を記録
            sortProcess.push(list.clone());
        }
        if (!flag) break;
    };
    
    return sortProcess;
};

selectionSort

var selectionSort = function(list)
{
    var sortProcess = [];
    
    var len=list.length;
    for (var i=0; i<len-1; ++i) {
        for (var j=i+1; j<len; ++j) {
            if (list[j]<list[i]) { list.swap(i, j); }
            // 過程を記録
            sortProcess.push(list.clone());
        }
    }
    
    return sortProcess;
};

quickSort

var quickSort = function(list)
{
    var sortProcess = [];
    
    (function(start, end) {
        var key = list[ Math.floor((start+end)/2) ];
        var i = start;
        var j = end;
        while (true) {
            while (list[i]=j) break;
            list.swap(i, j);
            ++i;
            --j;
            // 過程を記録
            sortProcess.push(list.clone());
        }
        
        // 再帰呼び出し
        if (start < i-1) arguments.callee(start, i-1);
        if (j+1 < end)   arguments.callee(j+1, end);
    })(0, list.length-1);
    
    return sortProcess;
};

TRACK BACK URL

POST COMMENT

メールアドレスが公開されることはありません。

COMMENT