我嘗試實現一個排序算法,其工作原理如下:給定一個長度爲n的數組,算法應遞歸調用自己的第一個2/3,然後打開最後2/3以及之後的數組的第一個2/3。在每次調用時,算法在查看兩個或更少元素並退出時應對當前數組進行排序。該方法應該採用數組A和兩個索引作爲參數。排序算法,它自己在一個數組的2/3
所以這裏的主要困難是創建代表數組2/3的索引。我的想法是做x = Math.floor((i-j)/3)
,使得x
是第一個1/3和第二個1/3中的元素的數量。所以前2/3可以由[i,x*2]
和[x+1,j]
的最後2/3限定。你覺得這個想法有什麼錯誤嗎?
我想出了下面的算法沒有正確排序,所以算法或上面的想法都有缺陷。你有沒有看到任何問題?
var threeSort = function(A,i,j) {
var diff = j-i;
if (diff <= 2) {
if (A[j] < A[i]) {
var tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
return;
}
var x = Math.floor(diff/3);
threeSort(A,i,x*2);
threeSort(A,x+1,j);
threeSort(A,i,x*2);
};
var arr = [3,4,1,4,2];
threeSort(arr, 0, arr.length-1);
https://jsfiddle.net/jyqyhxko/2/
我不明白爲什麼你認爲這種邏輯來對數組進行排序。但是,如果'A [j] Oriol
@Oriol正確,我將內部的回報移出if。錯誤消失了,但算法並沒有真正的排序。 –