快速排序算法 (js) 中的 If/else

If/else in quick sort algorithm (js)

提问人:Alt 提问时间:10/1/2023 更新时间:10/1/2023 访问量:50

问:

我目前正在学习一些排序算法,我意识到了快速排序,但它无法正常工作。它不仅对数组进行排序,还删除了重复的值。这是我的代码:

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 的末尾添加“继续”,但这无济于事。

JavaScript 数组排序 快速排序

评论

0赞 derpirscher 10/1/2023
因为如果你这样做了并且你错过了这种情况,即等于枢轴元素的元素不会被添加到两者中,因此,会丢失......if (x < y)if (x > y)if (x == y)lessgreater

答:

-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 数组,或者您可以添加第三个数组,或者只是一个计数器,在这种情况下,您必须在两个排序的子数组之间插入时间。greaterOrEquallessnnpivot
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]33i != pivotindexarray[i] > pivotarray[i] < pivot
1赞 Alt 10/1/2023
是的,我刚刚明白了,谢谢!而且为相等的值添加另一个数组会更好一些,它会工作得更快一些。
0赞 KaiKai 10/1/2023 #3

请注意,如果 ,代码 (1) 将不执行任何操作,但 (2) 将推送到 。因此,当 中存在重复值时,它的行为会有所不同。array[i] > pivotarray[i]greaterarray