当枢轴最小时,快速排序的分区

时间:2018-03-14 03:43:04

标签: javascript algorithm sorting

我选择中间点作为支点,但我不确定是否重要。

如果枢轴是集合中的最小值,则它无法正常工作。

如何选择一个数据透视表,以便我可以正确创建一个分区,以便以后在快速排序算法中使用?

/*

Modified from:

https://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/

*/
function partition (arr, i, j) {
  let pivot = Math.floor((i + j) / 2);
  while(i <= j) {
    while(arr[i] < arr[pivot]) { i++; }
    while(arr[j] > arr[pivot]) { j--; }
    if(i <= j) {
      swap(arr, i, j)
      i++;
      j--;
    }
  }
  return i;
}

function swap(list, ind1, ind2) {
  let temp = list[ind1];
  list[ind1] = list[ind2];
  list[ind2] = temp;
}

// pivot is minimum, breaks partition
let arr = [2, 1, 0, 1, 3, 4];

// start - [2, 1, 0, 1, 3, 4]
// swap1 - [0, 1, 2, 1, 3, 4]

partition(arr, 0, arr.length - 1)
console.log(arr);

1 个答案:

答案 0 :(得分:0)

不要为枢轴保留索引,保留枢轴元素,这样即使它被交换,你仍然可以与它进行比较:

function partition (arr, i, j) {
  const pivotIndex = Math.floor((i + j) / 2);
  const pivot = arr[pivotIndex];
  while(i <= j) {
    while(arr[i] < pivot) { i++; }
    while(arr[j] > pivot) { j--; }
    if(i <= j) {
      swap(arr, i, j)
      i++;
      j--;
    }
  }
  return i;
}

此外,您需要将<=运算符更改为<,但该问题与选择数据透视无关。