我在这样的应用程序中实现了 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 = [];
},
问题是这样的:
- 排序的第一部分只突出显示“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
我想强调的是那些位置发生变化的人。
我的错误是什么。
最佳答案
让我们尝试计算一下。值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/