快排

直接看代码:
有四个注意点:

  1. leetcode上rand库不好用,不知道究竟输入是啥
  2. 在进入左问题的过程中会出现溢出,因为ltuszie要进行处理
  3. while中应该是小于gt,这样才能省略额外空间,对应的,最后的右问题区间也是[gt, r]
  4. 就是大于的时候要注意,没有i+1

    1. pub fn sort_array(mut nums: Vec<i32>) -> Vec<i32> {
    2. let len = nums.len();
    3. partition(&mut nums, 0, len - 1);
    4. nums
    5. }
    6. fn partition(nums: &mut Vec<i32>, l: usize, r: usize) {
    7. if l>=r {
    8. return;
    9. }
    10. // 获取随机的pivot
    11. let pivot_index = rand::thread_rng().gen_range(l..=r);
    12. let pivot = nums[pivot_index];
    13. nums.swap(pivot_index, l);
    14. let mut lt = l;
    15. let mut gt = r + 1;
    16. let mut i = l + 1;
    17. // 注意是小于gt,不然重复了
    18. while i < gt {
    19. // 小于的数放在pivot左边
    20. if nums[i] < pivot && lt < r{
    21. lt += 1;
    22. nums.swap(lt, i);
    23. i += 1;
    24. }
    25. else if nums[i] == pivot {
    26. i += 1;
    27. } else {
    28. // 注意这个特殊情况,可能换过来还是大
    29. gt -= 1;
    30. nums.swap(gt, i);
    31. }
    32. }
    33. nums.swap(lt, l);
    34. let lt = match lt.checked_sub(1) {
    35. None => 0,
    36. Some(x) => x
    37. };
    38. partition(nums, l, lt);
    39. // 使用gt的目的
    40. partition(nums, gt, r);
    41. }

闭包——虚表
pin——自引用问题——协作式绿色线程调度