Swift刷算法:手撕快排

给你一个整数数组 nums,请你将该数组升序排列。
示例:
输入:nums = [5,2,4,3,1]
输出:[1,2,3,4,5]
LeetCode: https://leetcode.cn/problems/sort-an-array/

class Solution {
    func sortArray(_ nums: [Int]) -> [Int] {
        var nums = nums

        func fastsort(_ lo: Int, _ hi: Int) {
            // 越界判断
            if lo >= hi { return }
            // 一般使用第0个值作为基准即可
            // 这里随机取值防止极端情况出现O(N^2)复杂度
            let mid = Int.random(in: lo ... hi)
            // 记录基准值
            let pivot = nums[mid]
            // 变回熟悉的“一般使用第0个值作为基准即可”的情况
            nums[mid] = nums[lo]

            var i = lo, j = hi
            while i < j {
                // 找到右侧小于基准值的位置,填入左侧【坑位i】
                while i < j, nums[j] >= pivot { j -= 1 }
                nums[i] = nums[j]
                // 找到左侧大于基准值的位置,填入右侧【坑位j】
                while i < j, nums[i] <= pivot { i += 1 }
                nums[j] = nums[i]
            }
            // i、j 重合,该坑位填入基准值
            nums[i] = pivot

            // 分别递归排序基准值左、右两侧数组
            fastsort(lo, i - 1)
            fastsort(i + 1, hi)
        }

        fastsort(0, nums.count - 1)
        return nums
    }
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容