我为这样的应用程序实现了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 = [];
},问题是这样的:
如果索引0大于索引7 (占列表+ 1总数的一半),则它们将更改位置,
这是一对:
首次迭代: 15-21,14-6,0-7,34-12,2-5,44-34,6-20
我想强调的是那些只改变了立场的人。


我犯了什么错。
发布于 2015-08-26 17:27:14
我们试着算算吧。值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
}您正在检查的条件接近于这个条件,但是有一些不一致的错误,并且在执行mod时忘记了j的移位。试试这个,看看这能不能解决问题。
https://stackoverflow.com/questions/15288171
复制相似问题