提问人:Alt 提问时间:10/1/2023 更新时间:10/1/2023 访问量:50
快速排序算法 (js) 中的 If/else
If/else in quick sort algorithm (js)
问:
我目前正在学习一些排序算法,我意识到了快速排序,但它无法正常工作。它不仅对数组进行排序,还删除了重复的值。这是我的代码:
function quickSort(array) {
if (array.length <= 1) return array;
let pivotIndex = Math.floor(array.length / 2);
let pivot = array[pivotIndex];
let less = [];
let greater = [];
for (let i = 0; i < array.length; i++) {
count++;
if (i === pivotIndex) continue;
if (array[i] < pivot) { // *
less.push(array[i]);
}
if (array[i] > pivot) {
greater.push(array[i])
}
}
return [...quickSort(less), pivot, ...quickSort(greater)];
}
当我将两个 if(从行 * 开始)替换为以下代码时,它开始工作:
if (array[i] < pivot) {
less.push(array[i]);
} else {
greater.push(array[i])
}
我只是不明白有什么区别以及为什么第一个变体不起作用? 还有为什么它比选择排序甚至有时甚至冒泡排序的工作时间更长?
我还尝试在每个 if 的末尾添加“继续”,但这无济于事。
答:
-1赞
Maurice Perry
10/1/2023
#1
取代:
if (array[i] < pivot) { // *
less.push(array[i]);
}
if (array[i] > pivot) {
greater.push(array[i])
}
跟:
if (array[i] < pivot) { // *
less.push(array[i]);
} else {
greater.push(array[i])
}
评论
0赞
Alexander Nenashev
10/1/2023
这并不能回答这个问题,OP 已经这样做了
0赞
derpirscher
10/1/2023
这就是 OP 所做的,问题是:为什么这是解决方案......
0赞
Alt
10/1/2023
我知道它会起作用,但我不明白为什么?这些与变体之间有什么区别?
0赞
Maurice Perry
10/1/2023
@Alt很好,因为你有三个可能的结果进行比较(更少、更大、相等),但你只考虑其中的两个。我在这里提出的解决方案是通过将它们添加到“更大”数组(您可以重命名为)来处理等于枢轴的值,您也可以添加 in them 数组,或者您可以添加第三个数组,或者只是一个计数器,在这种情况下,您必须在两个排序的子数组之间插入时间。greaterOrEqual
less
n
n
pivot
0赞
Alexander Nenashev
10/1/2023
#2
if (array[i] < pivot) { // *
less.push(array[i]);
}
if (array[i] > pivot) {
greater.push(array[i])
}
在此选项中,您将错过值。从而删除它们。array[i] === pivot
评论
0赞
Alt
10/1/2023
但是仍然有行“if (i === pivotIndex) continue;”,无论如何,pivot 转到函数在“return [...quickSort(less)、pivot、...快速排序(更大)];”
1赞
derpirscher
10/1/2023
@Alt 考虑一个数组。pivot 元素位于数组的中间。但是,开始和结束仍然迷失了,因为对他们来说,但两者都不是真的[3,4,6,3,9,1,3]
3
3
i != pivotindex
array[i] > pivot
array[i] < pivot
1赞
Alt
10/1/2023
是的,我刚刚明白了,谢谢!而且为相等的值添加另一个数组会更好一些,它会工作得更快一些。
0赞
KaiKai
10/1/2023
#3
请注意,如果 ,代码 (1) 将不执行任何操作,但 (2) 将推送到 。因此,当 中存在重复值时,它的行为会有所不同。array[i] > pivot
array[i]
greater
array
上一个:快速排序的分段错误
下一个:Java 快速排序时间限制
评论
if (x < y)
if (x > y)
if (x == y)
less
greater