如果數組中的值都是正值(或全爲負值),避免溢出的一種方法是運行置換循環並使用整數符號標記訪問的索引。 (或者,如果數組長度小於2 ^(一個數組元素的位數 - 1),而不是使用符號,我們可以將所有值向左移動一位,並使用第一位標記訪問索引。)該算法在運行期間導致較少的迭代和較少的原始數組值的修改,而不是您要改進的算法。
的jsfiddle:http://jsfiddle.net/alhambra1/ar6X6/
JavaScript代碼:
function rearrange(arr){
var visited = 0,tmp,indexes,zeroTo
function cycle(startIx){
tmp = {start: startIx, value: arr[startIx]}
indexes = {from: arr[startIx], to: startIx}
while (indexes.from != tmp.start){
if (arr[indexes.from] == 0)
zeroTo = indexes.to
if (indexes.to == visited){
visited++
arr[indexes.to] = arr[indexes.from]
} else {
arr[indexes.to] = -arr[indexes.from]
}
indexes.to = indexes.from
if (indexes.from != tmp.start)
indexes.from = arr[indexes.from]
}
if (indexes.to == visited){
visited++
arr[indexes.to] = tmp.value
} else {
arr[indexes.to] = -tmp.value
}
}
while (visited < arr.length - 1){
cycle(visited)
while (arr[visited] < 0 || visited == zeroTo){
arr[visited] = -arr[visited]
visited++
}
}
return arr
}
什麼語言? C++? –
@MarcoAcierno:可能語言不可知。 – Zeta
@MarcoAcierno任何語言。我只是在尋找一種算法。 –