5分钟速通快排

574 阅读2分钟

不会吧,不会吧,不会真有人开始春招了还不会快排?

如果你还真不会,那请花上五分钟,让我带你5分钟解析JS快排!

1. 算法思想

  • 快排是典型的分治法基础,其思想是将一个极其庞大的任务不断分成小碎片,然后同时将小碎片逐个击破,达到快速完成的目的。
  • 其步骤大概可以分为:选取基点-分区-再操作-拼接 四个部分
  • 选取基点 排序是需要进行比较的,而基点就是我们比较的基准,也是分区的重要一环,而大家习惯性的喜欢选取C位元素
  • 分区 将和基点比较的结果分类存放,比较结束后将两个分区进行再次分区,也就是上述中的再操作,直至无法满足再操作
  • 连接 快排的结果其实是无数个小碎片,我们需要将其全部连接起来才可以得到正确结果

2. 手撕代码

/**
 * @author 江河丶
 * @param {nums[]} Array
 * @return Array
 */

function quickSort(nums) {
    // 传进来的数组如果如果为空或者只有一个元素,则直接返回
    if (nums.length < 2) {
        return nums;
    }

    // 快排核心代码

    // 选择中间元素作为快排的基点,获取基点的下标,待会需要取出
    let centerIndex = Math.floor(nums.length / 2);
    // 因为返回的是一个数组,使用0下标直接取用
    const centerNum = nums.splice(centerIndex, 1)[0];
    // 定义左右两个空数组,用于分区
    const left = [];
    const right = [];
    // 遍历数组
    nums.forEach(item => {
        // 如果元素大于基点,就存入右边,否则存入左边
        if (item > centerNum) {
            right.push(item);
        } else {
            left.push(item);
        }
    })
    // 使用递归调用,同时对左右两个分区进行快排,后面裂变后速度将极快
    // 将其连接,基点一定是放在中间的,很多人快排失败很可能是因为基点位置放错了
    return quickSort(left).concat(centerNum, quickSort(right));
}

3. 写在最后

  • 快速排序最重要的是理解其究竟快在哪里?同时需要理解一下分治法的思想,如何将一个庞大的计算任务切割成许许多多的小块来进行
  • 很多小伙伴认为学习了前端就算法知识不重要了,直到面试时候才发现自己已经连最基本的数据结构和算法都忘了
  • 学习算法一直认为是一个一次投入,终身受益的事情,哪怕是学习前端也不能丢了算法。因为面试时算法就是一道分水岭,其考察的不仅仅是一道算法,还有个人的思维方式和应变能力考验,同时可以看出一个人极限编程能力。