Leetcode前端必会系列:快速排序

102 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

给你一个整数数组 nums,请你将该数组升序排列。

 

示例 1:

输入: nums = [5,2,3,1]
输出: [1,2,3,5]

示例 2:

输入: nums = [5,1,1,2,0,0]
输出: [0,0,1,1,2,5]

 

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

分析

根据题目的分析,我们如何设计快速排序?首先,我们需要按照其设计地详细步骤进行自己地解决,步骤如下所示

  1. 设计快速排序的核心函数,控制分区地标记
  2. 设计分区函数,分区函数是快速排序地核心设计思想
  3. 分区函数初始化标记开始和结束位置,不断地轮询开始和结束地向中间逼近替换,使得左边分区地值永远小于标记地值,右边分区地值永远大于标记地值。
  4. 返回最后相遇地位置给主函数
  5. 递归结束,排序成功。

解答

   var sortArray = function(nums) {
    //快速排序
    const part = (begin,end) => {
        let node = nums[begin]
        while(begin<end) {
            while(begin<end && nums[end]> node) {
                end--
            }
            if(begin<end) {
                nums[begin++] = nums[end]
            }

            while(begin<end && nums[begin] <= node ) {
                begin++
            }
            if(begin<end) {
                nums[end--] = nums[begin]
            }
        }

        nums[begin] = node
        return begin
    }


    const main  = (begin,end) => {
        if(begin<end) {
            let index = part(begin,end)
            main(begin,index-1)
            main(index+1,end)
        }
    }   

    main(0,nums.length-1)

    console.log(nums)
};

sortArray([3,2,1,4,5])

通过题目的分析,我们按照快速排序设计的思想递归的完成了设计,经过分析得知快速排序的思想十分巧妙,可以大大提高我们的程序思想。

总结

通过对快速排序的设计和理解,我们学到了如何设计快速排序的过程,基于递归的手法巧妙地设计轻松地解决了问题。