私はJavaScriptに変換するためのクイックソルト実装のさまざまなバージョンのすべてについてインターネットを精査しており、その多くは正常に移植できません。JavaScriptへのquickselect
私は、これはJavaやC++、または掲載の人々が壊れている例についてのニュアンスを知らない私が原因であるかどうかを把握することができていません。
パフォーマンスは最適化されていませんが、読みやすく論理的です。
私はこの実装に着いたが、それは動作しないことに気づいた。
出力は(原因Math.random()への可能性が高い)ランダムであるが、私はアルゴに従うように、私はこの次のテストケースとイライラ。
出力は999、3、100、2、および1000から、私はロジックに従うことができない範囲と本当に誰かが、このような不安定な結果を与えることを何が起こっているかを説明いただければ幸いです。
function swap(array, idxA, idxB) {
var temp = array[idxA]
array[idxA] = array[idxB]
array[idxB] = temp
}
function partitionStart(arr, left, right, pivotIdx) {
var storeIdx = left, pivotVal = arr[pivotIdx];
swap(arr, pivotIdx, right)
for (var i = left; i <right; i++) {
if (arr[i] < pivotVal) {
swap(arr, storeIdx, i)
storeIdx++
}
}
swap(arr, pivotIdx, right);
return storeIdx;
}
function quickSelectLoop(arr, k) {
var pivotIndex, pivotNewIdx, pivotDist,
left = 0, right = arr.length-1
while(true) {
pivotIndex = Math.floor(Math.random()*arr.length)
pivotNewIdx = partitionStart(arr, left, right, pivotIndex)
pivotDist = pivotNewIdx - left
if (pivotDist === k) {
return arr[pivotNewIdx-1]
} else if (k < pivotDist) {
right = pivotNewIdx -1
} else {
k -= pivotDist+1
left = pivotNewIdx + 1
}
}
}
var test2 = [1000,999,1,2,3,100,105]
console.log(quickSelectLoop(test2, 4))
100はquickSelect(TEST2、4)=> 100から
予想出力は、コレクション内の4番目の最小要素である
その特定の入力のためのあなたの希望/期待される出力とは何ですか? – nnnnnn
以下のコンソールログは、test2の配列の中で4番目に小さな要素である100を出力します –
そして、表示していない 'swap()'の実装は、2つの配列インデックスの間で値を入れ替えますか? – nnnnnn