JavaScript 快速排序

快速排序是一种高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。

快速排序的基本原理

快速排序的基本思想是选择一个基准元素(通常选择第一个或最后一个元素),通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

选择基准元素

选择基准元素的方式有多种。最简单的方法是选取序列中的第一个元素作为基准。除此之外,还可以采用随机选取、三数取中等方法来选择基准元素,以减少排序过程中出现的最坏情况。

分区过程

分区过程是快速排序的核心,它负责将基准元素放到正确的位置,并确保所有小于基准的元素都在基准的左侧,所有大于基准的元素都在基准的右侧。

实现分区的步骤

  1. 初始化:设置两个指针leftright,分别指向序列的起始位置和结束位置。
  2. 移动指针:从右向左移动right指针,直到找到一个小于基准的元素;再从左向右移动left指针,直到找到一个大于基准的元素。
  3. 交换元素:交换这两个指针所指向的元素。
  4. 重复上述步骤:直到leftright相遇。
  5. 基准就位:将基准元素与相遇点的元素交换位置。

递归排序

完成一次分区后,基准元素已经处于最终位置。接下来,对基准左右两侧的子序列递归地进行快速排序。

JavaScript 中的快速排序实现

下面是一个简单的快速排序的实现:

-- -------------------- ---- -------
-------- -------------- ---- - -- ----- - ---------- - -- -
    -- ----- - ------ -
        ----- ---------- - -------------- ----- -------
        -------------- ----- ---------- - --- -- ---------
        -------------- ---------- - -- ------- -- ---------
    -
    ------ ----
-

-------- -------------- ----- ------ -
    ----- ----- - ---------- -- ------
    --- --- - ---- - -- -- ------
    --- ---- - ------ -- ------

    ----- ------ -
        -- -----------------------
        ----- ---- -- ---- -- --------- -- ------ -
            -------
        -
        -- -----------------------
        ----- ---- -- ---- -- -------- -- ------ -
            ------
        -
        -- ---- -- ----- -
            -- ---------------
            ---------- ---------- - ----------- ----------
        - ---- -
            -- --------------
            ------
        -
    -

    -- ------------
    ----------- ---------- - ----------- -----------
    ------ ----- -- ---------
-

示例

性能分析

快速排序的时间复杂度在最好情况下为O(n log n),在最坏情况下为O(n^2),平均情况下为O(n log n)。空间复杂度为O(log n),因为递归调用栈需要额外的空间。

快速排序在大多数情况下表现优秀,尤其是当数据分布均匀时。但当数据已经部分排序或者完全逆序时,其性能会显著下降。为了改善这种情况,可以使用随机化版本的快速排序或者选择合适的基准元素策略。

总结

快速排序是一种非常实用且高效的排序算法,广泛应用于各种场景中。通过合理的选择基准元素和优化分区过程,可以进一步提高其效率和稳定性。

上一篇: JavaScript 归并排序
下一篇: JavaScript 堆排序
纠错
反馈