JS【详解】快速排序

简介: JS【详解】快速排序

快速排序的时间复杂度为 O(n2)

排序流程

1、首先设定一个分界值(比如数组最中间的元素),通过该分界值将数组分成左右两部分。

2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。

3、对左侧和右侧的数据按1和2的逻辑不断执行,直至排序完成。

image.png

代码范例 1 — 使用 splice

 /**
         * 快速排序(使用 splice)
         * @param arr 原数组
         * @returns 排序的数组
         */
        function quickSort1(arr) {
            let length = arr.length
            if (length <= 1) return arr

            const midIndex = Math.floor(length / 2) // 中间的 index
            const midValue = arr.splice(midIndex, 1)[0] // 中间的值。splice 会修改数组
            const left = []
            const right = []

            // 注意这里使用 arr.length ,arr 被修改了
            for (let i = 0; i < arr.length; i++) {
                const n = arr[i]
                if (n < midValue) {
                    // 小于 midValue ,则放在左侧
                    left.push(n)
                } else {
                    // 大于等于 midValue ,则放在右侧
                    right.push(n)
                }
            }

            return quickSort1(left).concat(
                [midValue],
                quickSort1(right)
            )
        }

代码范例 2 — 使用 slice

/**
         * 快速排序(使用 slice)
         * @param arr 原数组
         * @returns 排序的数组
         */
        function quickSort2(arr) {
            const length = arr.length
            if (length <= 1) return arr

            const midIndex = Math.floor(length / 2) // 中间的 index
            const midValue = arr.slice(midIndex, midIndex + 1)[0] // 中间的值。注意,使用 slice,原数组没有改动

            const left = []
            const right = []

            for (let i = 0; i < length; i++) {
                if (i !== midIndex) {
                    const n = arr[i]
                    if (n < midValue) {
                        // 小于 midValue ,则放在左侧
                        left.push(n)
                    } else {
                        // 大于等于 midValue ,则放在右侧
                        right.push(n)
                    }
                }
            }

            return quickSort2(left).concat(
                [midValue],
                quickSort2(right)
            )
        }


目录
相关文章
|
6月前
|
搜索推荐 JavaScript 前端开发
用openAI写个js的排序算法(快速排序算法)
用openAI写个js的排序算法(快速排序算法)
35 0
|
6月前
|
前端开发 JavaScript 搜索推荐
js快排(JavaScript快速排序算法)- 前端面试
js快排(JavaScript快速排序算法)- 前端面试
168 0
|
6月前
|
JavaScript 搜索推荐 前端开发
JS数组自定义排序方法,冒泡排序、插入排序、选择排序和快速排序。
JS数组自定义排序方法,冒泡排序、插入排序、选择排序和快速排序。
72 0
|
6月前
|
JavaScript 前端开发 搜索推荐
JavaScript算法和数据结构:实现一个快速排序算法。
JavaScript算法和数据结构:实现一个快速排序算法。
50 0
|
JavaScript
js数组冒泡排序,快速排序的原理以及实现
js数组冒泡排序,快速排序的原理以及实现
64 0
|
存储 搜索推荐 JavaScript
如何使用JavaScript实现快速排序算法
如何使用JavaScript实现快速排序算法
113 0
|
搜索推荐 JavaScript
js 基础排序算法 之 冒泡排序, 选择排序, 插入排序,快速排序
js 基础排序算法 之 冒泡排序, 选择排序, 插入排序,快速排序
|
JavaScript
js数组的冒泡排序, 选择排序, 以及快速排序
js数组的冒泡排序, 选择排序, 以及快速排序
|
算法 前端开发 JavaScript
【前端算法】用JS实现快速排序
理解数组方法里面运用到的算法,splice 和 slice的区别
147 0
|
JavaScript 前端开发 索引
手撕前端面试题(Javascript~事件委托、数组去重、合法的URL、快速排序、js中哪些操作会造成内存泄漏......
手撕前端面试题(Javascript~事件委托、数组去重、合法的URL、快速排序、js中哪些操作会造成内存泄漏......
158 0
手撕前端面试题(Javascript~事件委托、数组去重、合法的URL、快速排序、js中哪些操作会造成内存泄漏......