我选择中间点作为支点,但我不确定是否重要。
如果枢轴是集合中的最小值,则它无法正常工作。
如何选择一个数据透视表,以便我可以正确创建一个分区,以便以后在快速排序算法中使用?
/*
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);
答案 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;
}
此外,您需要将<=
运算符更改为<
,但该问题与选择数据透视无关。