1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { func sortArray(_ nums: [Int]) -> [Int] { var nums = nums sort2(&nums, 0, nums.count - 1) return nums }
func sort2(_ nums: inout [Int], _ left: Int, _ right: Int) { if left < right { let p = partition(&nums, left, right) // 同样的方法处理分界值左边的数据 分界值的位置已经确定 所以传入 right = p - 1 sort2(&nums, left, p - 1) // 同样的方法处理分界值右边的数据 分界值的位置已经确定 所以传入 left = p + 1 sort2(&nums, p + 1, right) } }
func partition(_ nums: inout [Int], _ left: Int, _ right: Int) -> Int { // 直接以 nums[right] 为分界值 let p = nums[right] // 记录下一个 比分界值小的值 应该移动到哪个位置, 默认为最左边 var minL = left for i in left ..< right { // 当前值 小于等于分界值,那么交换 i 和 minL 的值。否则不做处理 if nums[i] <= p { swap(&nums, minL, i) // minL 已经被小于等于分界值的值占用,那么 += 1 minL += 1 } } // 到这里,在 minL 索引 前的值都是小于等于 分界值的,在 minL 到 right - 1,包括 minL 的值都是大于 分界值的。 分界值一直在最后 // 所以 把分界值 和 nums[minL] 交换位置 swap(&nums, minL, right) // 返回分界值所在的 位置 return minL }
func swap(_ nums: inout [Int], _ a: Int, _ b: Int) { let temp = nums[a] nums[a] = nums[b] nums[b] = temp } }
|