首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell排序中向受影响的值添加样式?

在shell排序中向受影响的值添加样式?
EN

Stack Overflow用户
提问于 2013-03-08 06:37:12
回答 1查看 71关注 0票数 1

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

代码语言:javascript
复制
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

我想强调的是那些只改变了立场的人。

我犯了什么错。

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 17:27:14

我们试着算算吧。值i表示开始向后交换元素的索引。值j是该元素最终结束的位置,increment表示步骤大小。

考虑一个位于counter位置的元素。如果以下所有内容都为真,则将其与移动的元素交换:

  • counter是从j (即increment的倍数)向前迈出的几步。换句话说,counter >= j && counter - j % increment == 0
  • counter还没有超过起点。换句话说,counter <= i
  • 至少有一个元素移动了。换句话说,i != j

将这些因素结合在一起,就会产生这样的条件:

代码语言:javascript
复制
if (i != j && counter <= i && counter >= j && counter - j % increment == 0) {
    // Element was swapped
} else {
    // Element was not swapped
}

您正在检查的条件接近于这个条件,但是有一些不一致的错误,并且在执行mod时忘记了j的移位。试试这个,看看这能不能解决问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15288171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档