快排
直接看代码:
有四个注意点:
- leetcode上rand库不好用,不知道究竟输入是啥
- 在进入左问题的过程中会出现溢出,因为
lt是uszie要进行处理 while中应该是小于gt,这样才能省略额外空间,对应的,最后的右问题区间也是[gt, r]就是大于的时候要注意,没有i+1
pub fn sort_array(mut nums: Vec<i32>) -> Vec<i32> {let len = nums.len();partition(&mut nums, 0, len - 1);nums}fn partition(nums: &mut Vec<i32>, l: usize, r: usize) {if l>=r {return;}// 获取随机的pivotlet pivot_index = rand::thread_rng().gen_range(l..=r);let pivot = nums[pivot_index];nums.swap(pivot_index, l);let mut lt = l;let mut gt = r + 1;let mut i = l + 1;// 注意是小于gt,不然重复了while i < gt {// 小于的数放在pivot左边if nums[i] < pivot && lt < r{lt += 1;nums.swap(lt, i);i += 1;}else if nums[i] == pivot {i += 1;} else {// 注意这个特殊情况,可能换过来还是大gt -= 1;nums.swap(gt, i);}}nums.swap(lt, l);let lt = match lt.checked_sub(1) {None => 0,Some(x) => x};partition(nums, l, lt);// 使用gt的目的partition(nums, gt, r);}
闭包——虚表
pin——自引用问题——协作式绿色线程调度
