算法学习记录(四)

90 阅读1分钟

快速排序

问:

  1. 快速排序

解:

  1. 随机target+双指针
const sortArray = function(arr) {
    const partition = (left, right, target) => {
        let smaller = left - 1
        let bigger = right + 1
        while (left < bigger) {
            if (arr[left] < target) {
                smaller++
                [arr[left], arr[smaller]] = [arr[smaller], arr[left]]
                left++
            } else if (arr[left] > target) {
                bigger--
                [arr[bigger], arr[left]] = [arr[left], arr[bigger]]
            } else {
                left++
            }
        }
        // 返回左右区域坐标
        return {
            smaller,
            bigger
        }
    }
    const getRes = (left, right) => {
        if (left >= right) return
        const target = arr[~~(Math.random() * (right - left + 1)) + left]
        const { smaller, bigger } = partition(left, right, target)
        getRes(left, smaller)
        getRes(bigger, right)
    }
    getRes(0, arr.length - 1)
    return arr
};