Quicksort算法存在问题。我已经在互联网上阅读了关于它的不同页面,也包括维基百科。但他们没有详细解释太多。
当你选择最后一个元素作为枢纽时,我已经理解了他们的例子。在这种情况下,您选择另外两个变量i
,其中j
将遍历数组,直到它找到一个大于pivotelement的元素和i,j
,直到它找到一个低于the的元素主元。找到后,我们切换显示i,j
的元素,然后继续......
我的问题是,您首先选择哪个元素1
?我们假设我们已经给出了这个数组,而关键元素是i
:
9 1 4 2 0 7
我的j
是什么,我的i
是什么?
我认为第一个元素是9
,所以j
而7
是数组中的最后一个元素,所以OBS
.buffer(SUB)
.withLatestFrom(SUB)
.map(([buffer, t]) => {
if(!buffer || !buffer.length) {
return null;
}
if(t === T) {
return buffer[buffer.length - 1];
}
return null;
})
.filter((e) => !!e);
?
答案 0 :(得分:1)
维基百科很好地解释了它:
C.A.R.描述的原始分区方案。霍尔使用两个 那么从被分区的数组的末尾开始的索引 相互移动,直到他们发现反转
所以答案是肯定的,将i
设置为第一个和j
到数组的最后一个元素并将它们移动直到它们相遇,这是quicksort算法的分区部分的基础。
每当您不确定时,最好检查确切的代码。有几种变体,你可以找到一个,例如here:
function quicksort(array)
if length(array) > 1
pivot := select any element of array
left := first index of array
right := last index of array
while left ≤ right
while array[left] < pivot
left := left + 1
while array[right] > pivot
right := right - 1
if left ≤ right
swap array[left] with array[right]
left := left + 1
right := right - 1
quicksort(array from first index to right)
quicksort(array from left to last index)
如您所见,left
和right
(相当于您的i
和j
)被设置为数组的第一个和最后一个索引。
答案 1 :(得分:1)
你可以做的是分别从(0)和(列表长度 - 1)开始。
SPOILER(如果您不想在JavaScript中使用解决方案,请不要阅读下面的代码或点击链接,并且宁愿使用我在第一个声明中提供的信息自行解决这个问题。)
在JavaScript here中查看我的快速排序算法。
以下是仅供将来参考的示例:
function quicksort(items, left, right) {
if (items.length > 1) {
left = typeof left !== 'number' ? 0 : left;
right = typeof right !== 'number' ? items.length - 1 : right;
let index = partition(items, left, right);
if (left < index - 1) {
quicksort(items, left, index - 1);
}
if (index < right) {
quicksort(items, index, right);
}
}
return items;
}
function swap(items, firstIndex, secondIndex) {
let temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
function partition(items, left, right) {
let pivot = items[Math.floor((right + left) / 2)],
i = left,
y = right;
while (i <= y) {
while(items[i] < pivot) {
i++;
}
while(items[y] > pivot) {
y--;
}
if (i <= y) {
swap(items, i, y);
i++;
y--;
}
}
return i;
}
let arr = [10, 3, 7, 5, 9, 2, 8, 1, 6, 4];
console.log(quicksort(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]