javascript - 在 shell 排序中为受影响的值添加样式?

标签 javascript algorithm sorting visualization shellsort

我在这样的应用程序中实现了 shell 排序算法:

shell: function() {
    var list = anada.vars.$list;
    for (i = 0; i < list.length; i++) {
        list[i] = parseInt(list[i], 10);
    }
    var n = list.length;
    var increment = Math.floor(n / 2);
    var i;        

    while (increment > 0) {
        for (i = increment; i < n; i++) {
            var temp = list[i];
            var j = i;
            var affectedOne = j;
            var affectedTwo;
            while (j >= increment && list[j - increment] > temp) {
                list[j] = list[j - increment];
                j -= increment;
            }
            list[j] = temp;
            var rows = '<tr>';
            for (counter = 0; counter < n; counter++) {
                if (counter > j - increment && counter < i + 1 && counter % increment == 0) {
                    rows += '<td class="affected">' + list[counter];
                } else {
                    rows += '<td>' + list[counter];
                }
            }
            anada.vars.$elements.push(rows);
        }
        increment = Math.floor(increment / 2);
        var row = '<tr>';
        $.each(list, function(n, val) {
            row += '<td class="iteration">' + val;
        });
        anada.vars.$elements.push(row);

    }
    $('.result-content').find('table').empty();
    $.each(anada.vars.$elements, function(n, val) {
        $('.result-content').find('table').append(val);
    });
    anada.vars.$elements = [];

},

问题是这样的:

  1. 排序的第一部分只突出显示“21”,它不能突出显示,因为 15 和 21 没有从条目中改变它的位置。列表条目是 15,14,0,34,2,44,21,6,7,12,5,34,20。

如果索引 0 大于索引 7,即列表总数的一半 + 1,它们将改变位置,

这是配对:

第一次迭代: 15-21, 14-6, 0-7, 34-12, 2-5, 44-34, 6-20

我想强调的是那些位置发生变化的人。

first part of the sorting after some iterations, the ending part is like a insertion sort

我的错误是什么。

最佳答案

让我们尝试计算一下。值i表示开始向后交换元素的索引。值j是该元素最终结束的地方,increment表示步长。

考虑一个位于 counter 位置的元素.如果满足以下所有条件,则它与移动的元素交换:

  • counter是从 j 向前迈出的许多步那是 increment 的倍数.换句话说,counter >= j && counter - j % increment == 0 .

  • counter没有超过起点。换句话说,counter <= i .

  • 至少移动了一个元素。换句话说,i != j .

把这些放在一起会产生这个条件:

if (i != j && counter <= i && counter >= j && counter - j % increment == 0) {
    // Element was swapped
} else {
    // Element was not swapped
}

您正在检查的条件接近于此条件,但有一些差一错误并且忘记移动 j。在做模组的时候。试试这个,看看是否能解决问题。

关于javascript - 在 shell 排序中为受影响的值添加样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15288171/

相关文章:

php - 如何从 ePub 图书写入服务器

两个对象的Javascript联合

python - 给定两个二维点列表,如何为第一个列表中的每个点找到第二个列表中最近的点?

angularjs - 使用交替顺序对 ng-repeat 进行排序

javascript - 按日期排序 div(即 div id)

javascript - 如何在 JavaScript 中获取 UTC 时间戳?

javascript - D3js 和 CSS 选择器

algorithm - 用颜色填充封闭的不规则形状的方法是什么?

arrays - 最高百分比增加

javascript - 如何在多个键上对 ImmutableJS List 对象进行排序?