由于某些原因,如果我使用end或mid pivot,算法可以正常工作,但如果我使用Math.random()使用随机数据透视表,结果每次显示错误和不同。
function quick_sort(A, start, end) {
if (start < end) {
var pIndex = partition(A, start, end);
quick_sort(A, start, pIndex - 1);
quick_sort(A, pIndex + 1, end);
}
}
function partition(A, start, end) {
var randomIndex = Math.floor(Math.random() * end + 1);
swap(A, randomIndex, end);
var pivot = A[end];
var pIndex = start;
for (var i = start; i < end; i++) {
if (A[i] <= pivot) {
swap(A, pIndex, i);
pIndex++;
}
}
swap(A,end, pIndex);
return pIndex;
}
function swap(A, i, j) {
var tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
var A = [12,-3, -123, 0, 11, 1, 2, 6, 4];
console.log(A);
quick_sort(A,0, A.length-1);
console.log(A);
输出
~ node test.js
[ 12, -3, -123, 0, 11, 1, 2, 6, 4 ]
[ -123, -3, 0, 1, 6, 4, 2, 11, 12 ]
~ node test.js
[ 12, -3, -123, 0, 11, 1, 2, 6, 4 ]
[ -123, 4, 0, 6, -3, 1, 2, 11, 12 ]
答案 0 :(得分:0)
此行不正确:
var randomIndex = Math.floor(Math.random() * end + 1);
因为您在[1 ... end]
中选择了一个支点而没有考虑起始索引。 (处理调用quick_sort(A, pIndex + 1, end)
时,起始索引可以是数组中的任何位置。)
应该是:
var randomIndex = Math.floor(start + Math.random() * (end - start + 1));