Bootstrap

前端之算法(四)快速排序

大家好,今天我们要聊的是快速排序,一种性能更好的排序算法。那我们开始吧!Let's go !

快速排序

快速排序比冒泡排序、选择排序、插入排序的性能都要好,也是以一种用于实战的排序算法,Chrome曾经就用它作为sort的排序算法。

快速排序的思路

  • 分区:从数组中任意选择一个 ,所有比基准小的元素放在基准前面,比基准大的元素放在基准的后面。

  • 递归:递归地对基准前后地子数组进行分区。

快速排序动画

  • 首先选择数组中任意一个作为基准,既然是任意,就以数组地第一个作为基准。

  • 为当前基准。

  • 然后对数组进行挨个比较, 为当前比对地元素。

  • 比基准大的为,小的为。

  • 一轮循环后,把 基准插入到所有绿色后面。

  • 就完成了整个分区操作。

  • 接下来对前后两个分区递归进行如上分区操作。

  • 就可以完成整个排序了。

实现

Array.prototype.quickSort = function () {
    const rec = arr => {
        if (arr.length === 1) return
        const left = []
        const right = []
        const mid = arr[0]
        for (let i = 1; i < arr.length; i++) {
            if (arr[i] < mid) {
                left.push(arr[i])
            } else {
                right.push(arr[i])
            }
        }
        return [...rec(left), mid, ...rec(right)]
    }
    const res = rec(this)
    res.forEach((n, i) => { this[i] = n })
}
const arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
arr.quickSort()
console.log(arr);
// [
   2,  3,  4,  5, 15, 19,
  26, 27, 36, 38, 44, 46,
  47, 48, 50
]

快速排序的时间复杂度

  • 递归的时间复杂度是 O(logN)。

  • 分区操作的时间复杂度是 O(n)。

  • 时间复杂度:O(n * logN)。

End~~~