JavaScript快速排序(quickSort)算法的实现方法总结

 更新时间:2023年11月21日 11:01:48   作者:进二开物  
快速排序的思想式 分治法,选一个基准点,然后根据大小进行分配,分配然完毕之后,对已经分配的进行递归操作,最终形成快速排序,所以递归也是快速排序思想的一个重要组成部分,本文主要给大家介绍了JavaScript实现快速排序的写法,需要的朋友可以参考下

什么是快速排序?

快速排序的思想式 分治法。选一个基准点,然后根据大小进行分配,分配然完毕之后,对已经分配的进行递归操作,最终形成快速排序。所以递归也是快速排序思想的一个重要组成部分。

基本思路

  • 基准点: 选中基准点,一般选择数组第一项,当然也可以随机或者指定数据。
  • 分区,一般分为 less/greater 或者 left/right
  • 递归: 对已有的分区经进行递归操作
  • 合并:将已有的数据进行合并

写法一:基础写法

function quickSort(arr) {
    // 数组小于 1 不用排序,直接返回即可
    if(arr.length <= 1) {
        return arr;
    }
    
    const p = arr[0]; // 选定数组第一个为基准点
    const left = []; // 左分区
    const right = []; // 右分区
    
    // 遍历给左右分区
    for(let i = 1; i < arr.length; i++) {
        if(arr[i] < p) {
            // 小于基准点放在左边
            left.push(arr[i])
        }else {
            // 大于基准点方在右边
            right.push(arr[i])
        }
    }
    // 合一并且对左右分区,递归处理
    
    return quickSort(left).concat(p, quickSort(right))
}

写法二: 函数式

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const p = arr[0]; // 确定中间值
        const left = arr.slice(1).filter(x => x <= p);
        const right = arr.slice(1).filter(x => x > p);
        return quickSort(left).concat(p, quickSort(right))
    }
}

使用 filter 过滤,偏向函数式编程,写的代码更加简洁。

写法三:随机基准值

function randomizeQuickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const pi = Math.floor(Math.random() * arr.length); // 随机基准值索引
        const p = arr[pi];
        const left = arr.slice(0, pi).concat(arr.slice(pi + 1).filter(x => x <= p));
        const right = arr.slice(pi + 1).filter(x => x > p);
        return randomizeQuickSort(left).concat(p, randomizeQuickSort(right))
    }
}

随机获取基准值索引,根据随机索引获基准值,所有这两个已知的值,就可以制作一个随机索引快速排序了。

写法四:三分法

function threeWayQuickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const p = arr[0];
        const left = arr.filter(x => x < p);
        const mid = arr.filter(x => x === p); // 获取所有的中间值,避免重复计算
        const right = arr.filter(x => x > p);
        return threeWayQuickSort(left).concat(mid, threeWayQuickSort(right))
    }
}

三路法,将二路基础上,将自己看成一个中间数组,因为与自己相等的可能有很多。这样就避免了在其他数组中,还有中间数据的重复比较, 一种快速排序的优化。

排序算法的使用场景

  • 大规模数据排序速度,比其他的算法要快

复杂度分析

  • 快速排序的平均时间复杂度是 O(n log n) 这种复杂度是比较理想的。O(n log n) 来源是 划分 O(n)递归 O(log n) 的组合。

更难展望

  • 双轴快速排序
  • 尾递归优化

小结

文本主要讲解常用算法中的快速排序的算法, 快速排序的思想很简单,就是分与合配合递归的思想。选定一个基准值,然后进行对比分离,递归这个操作,然后重新配合在一起。当然排序算法也是可以根据自己的需求进行优化的。

相关文章

  • 用JS动态设置CSS样式常见方法小结(推荐)

    用JS动态设置CSS样式常见方法小结(推荐)

    本文给大家总结了js动态设置css样式的常见方法,非常实用,对js设置css样式相关知识感兴趣的朋友一起学习吧
    2016-11-11
  • Typescript中infer关键字的使用小结

    Typescript中infer关键字的使用小结

    infer是TypeScript中条件类型的一个关键字,主要用于在条件类型中进行类型推断,下面就来详细的介绍一下Typescript infer关键字的使用,感兴趣的可以了解一下
    2026-01-01
  • 如何用JS解析剪切板里的excel内容

    如何用JS解析剪切板里的excel内容

    这篇文章主要介绍了如何用JS解析剪切板里的excel内容,对解析excel感兴趣的同学,可以参考下
    2021-04-04
  • JS在Canvas元素内绘制钟表

    JS在Canvas元素内绘制钟表

    这篇文章介绍了JS在Canvas元素内绘制钟表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • JavaScript实现定时器循环展示数组

    JavaScript实现定时器循环展示数组

    这篇文章主要为大家详细介绍了JavaScript实现定时器循环展示数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • js实现轮播图自动切换

    js实现轮播图自动切换

    这篇文章主要为大家详细介绍了js实现轮播图自动切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JavaScript中setInterval的用法总结

    JavaScript中setInterval的用法总结

    这篇文章主要是对JavaScript中setInterval的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • COM组件中调用JavaScript函数详解及实例

    COM组件中调用JavaScript函数详解及实例

    这篇文章主要介绍了COM组件中调用JavaScript函数详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • JS实现字符串去重及数组去重的方法示例

    JS实现字符串去重及数组去重的方法示例

    这篇文章主要介绍了JS实现字符串去重及数组去重的方法,涉及javascript针对字符串与数组的遍历、判断、删除、添加等相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • JavaScript清空数组元素的两种方法简单比较

    JavaScript清空数组元素的两种方法简单比较

    这篇文章主要介绍了JavaScript清空数组元素的两种方法简单比较,罗列了几种常见的情况javascript数组的方法,并且比较了其中的两种常见方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论