js 实现快速排序算法

快速排序: 使用的是分治法的思想。通过选定一个数字作为比较值,将要排序其他数字,分为 > 比较值 和 < 比较值两个部分**。**并不断重复这个步骤,直到只剩要排序的数字只有本身,则排序完成。虽然在最坏情况下其时间复杂度可能达到O(n²),但在实际应用中其平均时间复杂度为O(nlogn),具有很高的效率。适用于处理大规模数据。

javascript 复制代码
const quickSort = (arr, left, right) => {
    if (left >= right) {
        return
    }
    const begin = left
    const end = right
    // 将数组第一个值 begin 做为比较值,并且 begin 位置不动
    const top = arr[left];
    while (left < right) {
        // right先走,找出比top小的数字,这些数字之间不区分大小顺序
        while (arr[right] >= top && left < right) {
            right--;
        }

        // left再走,找出比top大的数字,这些数字之间不区分大小顺序
        while (arr[left] <= top && left < right) {
            left++;
        }
        // 交换left,right值,让比top小的到前面,比top大的到后面去
        [arr[left], arr[right]] = [arr[right], arr[left]]
    }

    // 循环结束后,排除begin时,left后面的数据比top大,left及以前面数据比top小
    [arr[begin], arr[left]] = [arr[left], arr[begin]]
    // 将begin和left交换位置,这样top后面的数据都比它大,top前面数据比它小

    // 将top左右两边的两个区间进行快速排序
    quickSort(arr, begin, left - 1);
    quickSort(arr, left + 1, end);
}

const arr = [5, 9, 7, 2, 1, 3, 4, 6, 8]
quickSort(arr, 0, arr.length - 1)
console.log(arr)

**三数取中法:**快速排序优化方法。用于快速排序等算法中选取基准元素。它选取待排序数组中第一个、中间和最后一个元素中的中值作为基准,以保证基准元素的选择相对均匀,从而提高排序效率。这种方法在处理大量数据时表现优秀,能有效减少比较和交换次数,提高排序速度。

javascript 复制代码
const quickSort = (arr, left, right) => {
    if (left >= right) {
        return
    }
    const begin = left
    const end = right
    // 优化,三数取中法,注意加分号,不然下面交换语句报错
    const mid = getMid(arr, left, right);
    // 将下标和left交换值
    [arr[left], arr[mid]] = [arr[mid], arr[left]]
    // 是将数组第一个值 begin 做为比较值
    const top = arr[left];
    while (left < right) {
        // right先走,找出比top小的数字,这些数字之间不区分大小顺序
        while (arr[right] >= top && left < right) {
            right--;
        }

        // left再走,找出比top大的数字,这些数字之间不区分大小顺序
        while (arr[left] <= top && left < right) {
            left++;
        }
        // 交换left,right值,让比top小的到前面,比top大的到后面去
        [arr[left], arr[right]] = [arr[right], arr[left]]
    }

    // 循环结束后,排除begin时,left后面的数据比top大,left及以前面数据比top小
    [arr[begin], arr[left]] = [arr[left], arr[begin]]
    // 将begin和left交换位置,这样top后面的数据都比它大,top前面数据比它小

    // 将top左右两边的两个区间进行快速排序
    quickSort(arr, begin, left - 1);
    quickSort(arr, left + 1, end);
}

const getMid = (arr, left, right) => {
    const mid = Math.floor((left + right) / 2)
    const mids = [[left, arr[left]], [right, arr[right]], [mid, arr[mid]]]
    mids.sort((a, b) => a[1] - b[1])
    return mids[1][0]
}

const arr = [5, 9, 7, 2, 1, 3, 4, 6, 8]
quickSort(arr, 0, arr.length - 1)
console.log(arr)
相关推荐
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 3 章 字典系统、IO 体系与对象注册表
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 2 章 wmake:OpenFOAM 自研构建系统与编译配置体系
算法·开源
用户81849100742161 小时前
我把工位上的“AI牛马”养成了:一个技术人的 AiPy 实战手记
算法
Tisfy1 小时前
LeetCode 3727.最大交替平方和:排序 (双指针可选)
算法·leetcode·题解·贪心·数组·排序
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 9 章 有限体积离散框架:`fvMatrix`、`fvSchemes` 与 `fvSolution`
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 7 章 网格与拓扑体系:`polyMesh`、`primitiveMesh` 与 patch
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 5 章 数值基元、维度系统与 `Field` 体系
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 10 章 离散算子与插值格式:`grad` / `div` / `laplacian` / `ddt` 的实现
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 4 章 运行期选择机制(RTS):OpenFOAM 的"插件式"对象工厂
算法·开源
CHEEVEN_QY1 小时前
热仿真在液冷板设计中的应用价值与局限性客观评估
人工智能·算法