在javascript,shell排序,插入排序中排序值时确定受影响的行

时间:2013-03-17 07:50:11

标签: javascript jquery algorithm sorting

我在我的应用程序中有这些排序算法,我想跟踪受影响的值,或者在排序过程中交换的值。我想强调一下。

我已经解决了泡泡排序和选择排序这个问题,但不知何故我无法使用插入排序和shell排序。

以下是我要做的事情的小提琴:

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

正如您所看到的,在迭代的最后一部分,这更像是插入排序,所以我不会问如何在插入排序中执行此操作。最大的问题是迭代的第一部分,第二部分,第三部分,因为它没有任何意义。并在迭代的最后部分。我也强调了不交换的值。

我该如何纠正这个问题。谢谢! 这是错误的代码:

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');
},

我尝试按照下面的答案,但我无法做到正确,我错过了什么?

1 个答案:

答案 0 :(得分:0)

就个人而言,我会尽可能地将分类本身与跟踪分开。通过创建一个通用的跟踪对象来执行此操作:

  • 最初接受未排序的数组,记住它并打印出来。
  • 作为排序迭代,接受数组的每个部分排序版本,将其与先前版本进行比较并使用适当的突出显示进行打印。

这种方法有两个好处:

  • 在排序例程中,HTML构建将简化为一行 - 一个简单的函数调用
  • 范例适用于所有排序算法。

修改

以下是一些代码:

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;
}

Updated fiddle