0

アプリケーションにこれらの並べ替えアルゴリズムがあり、影響を受ける値、または並べ替えプロセス中に交換された値を追跡したいと考えています。それらを強調したいと思います。

バブルソートとセレクションソートでこの問題を解決しましたが、どういうわけか挿入ソートとシェルソートでうまくいきません。

これが私がやろうとしていることのフィドルです:

http://jsfiddle.net/4jnXf/1/

ご覧のとおり、反復の最後の部分は挿入ソートに似ている可能性が高いため、挿入ソートでそれを行う方法については質問しません。大きな問題は、イテレーションの最初の部分、2 番目の部分、3 番目の部分です。意味がないからです。そして、反復の最後の部分。スワップしない値も強調表示します。

どうすればこれを修正できますか。ありがとうございました!欠陥のあるコードは次のとおりです。

shell: function() {
    var list = anada.vars.$list;
    $.each(list, function(key, value){
        if (!isNaN(list[key])) {
            list[key] = parseInt(list[key]);
        } else {

        }
    });
    var n = list.length;
    var increment = Math.floor(n / 2);
    var i;
    while (increment > 0) {
        var unsorted = list;
        for (i = increment; i < n; i++) {
            var temp = list[i];
            var j = i;
            while (j >= increment && list[j - increment] > temp) {
                list[j] = list[j - increment];
                j -= increment;
            }
            list[j] = temp;
            var rows = '<tr>';
            for (ctr = 0; ctr < unsorted.length; ctr++) {
                if (list[ctr] !== unsorted[ctr]) {
                    rows += '<td class="affected">' + list[ctr];
                } else {
                    rows += '<td>' + list[ctr];
                }
            }

            anada.vars.$elements.push(rows);
        }
        increment = Math.floor(increment / 2);
        var row = '<tr>';
        anada.app.generateIterationList(list);

    }
    anada.app.generateTable('result-shell', 'Result of Shell Sort');
},

以下の回答に従ってみましたが、うまくいきません。何が欠けていますか?

4

1 に答える 1

0

個人的には、ソート自体を追跡から可能な限り分離します。これを行うには、次の一般化された追跡オブジェクトを作成します。

  • 最初にソートされていない配列を受け入れ、それを記憶して出力します。
  • 並べ替えが繰り返されると、配列の部分的に並べ替えられた各バージョンを受け入れ、それを以前のバージョンと比較し、適切な強調表示で出力します。

このアプローチには、次の 2 つの利点があります。

  • ソート ルーチンでは、HTML の構築は 1 行に短縮されます。単純な関数呼び出しです。
  • このパラダイムは、すべてのソート アルゴリズムに適用できます。

編集

ここにいくつかのコードがあります:

PrinterComparitor: function(container) {
    var _arr, _container;
    var init = function(container) {
        _container = container.empty();
    };
    var printMessage = function(message) {
        var $tr = $("<tr/>").addClass('message').appendTo(_container);
        var $td = $("<td/>").text(message).appendTo($tr);
        $td.attr('colspan', length);
        setMessageSpans();
    };
    var setMessageSpans = function() {
        var $messages = _container.find(".message");
        var length = _container.find("tr").not($messages).filter(":last").find("td").length || 1;
        $messages.find("td").attr('colspan', length);
    };
    var print = function(arr) {
        var $tr = $("<tr/>").appendTo(_container);
        var $td;
        $.each(arr, function(i, val) {
            $td = $("<td/>").text(val).appendTo($tr);
            if(_arr && _arr[i] !== val) $td.addClass('affected');
        });
        _arr = $.extend(arr);
        setMessageSpans();
    };
    init(container);
    this.init = init;
    this.print = print;
    this.printMessage = printMessage;
}

更新されたフィドル

于 2013-03-17T08:29:17.560 に答える