为啥在我的情况下快速排序总是比冒泡排序慢?

Posted

技术标签:

【中文标题】为啥在我的情况下快速排序总是比冒泡排序慢?【英文标题】:Why quick sort is always slower than bubble sort in my case?为什么在我的情况下快速排序总是比冒泡排序慢? 【发布时间】:2022-01-15 13:54:33 【问题描述】:

他们使用相同的数组:

QUICK SORT 时间:3159 毫秒(数组长度 10K)

冒泡排序时间:1373毫秒(数组长度10K)

我正在尝试使用快速排序和冒泡排序算法比较排序时间。我使用具有 10K 个不同随机数的数组,这些随机数按随机顺序对两个函数进行排序。但是由于某种原因,冒泡排序总是比快速排序更快地排序数组,即使冒泡排序的平均时间复杂度比快速排序的平均时间复杂度差。在我的情况下,为什么冒泡排序算法比快速排序算法慢? (我尝试了不同长度的数组,从 10 到 10K)

这就是我的快速排序功能

let quickSort = (arr) => 
    if (arr.length <= 1) 
        return arr
    
    const pivot = arr[0]
    const rest = arr.slice(1);
    let left = [],
        right = [];
    rest.forEach(el => el > pivot ? right = [...right, el] : left = [...left, el]);
    return [...quickSort(left), pivot, ...quickSort(right)];

这就是我的冒泡排序函数

let bubbleSort = (arr) => 
    for (let i = 0; i < arr.length; i++) 
        for (let s = i + 1; s < arr.length; s++) 
            if (arr[s] < arr[i]) 
                let a = arr[i];
                arr[i] = arr[s]
                arr[s] = a;
                   
        
    
    return arr

【问题讨论】:

快速排序正在制作大量副本,冒泡排序正在原地交换。 right = [...right, el] 这会导致每个步骤的总体操作为 O(n²) - 您复制的内容太多了。 @ASDFGerte 哦,没错,在我将其更改为连接后,它的工作速度如此之快。现在:快速排序时间:32 毫秒。冒泡排序时间:1556 毫秒。谢谢 :) Quicksort 根本不需要复制,如果你想更快,你可以做一个实现,它只是就地排序。 PS:我不太确定您最初的快速排序顺序是什么,介于 O(n²) 和 O(n²log(n)) 之间,但为时已晚,我开始犯错误并错过简单的事情。 【参考方案1】:

正如@Barmar 所说,Quicksort 正在制作大量副本。

此外,每个 扩展运算符(3 个点运算符)的复杂度为 O(n),因为 它会遍历整个数组(就像一个简单的 for 循环),这也可能使算法变慢。

【讨论】:

哦,现在明白为什么它这么慢了,现在快速排序不复制,而只是连接数组,所以现在它比冒泡排序快得多。谢谢!

以上是关于为啥在我的情况下快速排序总是比冒泡排序慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的基数排序 JAVA 实现比快速排序慢?

为啥我的基数排序 python 实现比快速排序慢?

漫画算法17初识快速排序

为啥输入较小时插入排序比快速排序快?

nodejs实现冒泡排序和快速排序

JDK 源码分析:快速排序算法