为什么这个带有随机枢轴的QuickSort工作正常?

时间:2016-08-10 23:07:21

标签: javascript sorting quicksort

由于某些原因,如果我使用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 ]

1 个答案:

答案 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));