简介
对数组 nums 排序,快排的方法是现在nums随机选择一个数字 x,然后将比 x 小的放到数组左边,比x大的放到数组右边。然后对左右两边分别递归。
效率
- 时间复杂度:
- 空间复杂度:
-
实现
分组代码:
use rand::{thread_rng, Rng};// 对nums进行分组,并返回分组后中间元素的位置fn partition(nums: &mut [i32]) -> usize{if nums.len() <= 0 {panic!("array contains no elements");}// 随机选择一个元素xlet index = thread_rng().gen_range(0, nums.len());let end = nums.len() - 1;// 将选择的元素x先换到最后nums.swap(index, end);// small 表示下一个比选中的数x小的数该放的位置,递增的let mut small = 0;for i in 0..nums.len()-1{// 遇到比选中元素x小的,替换到small位置,small前进一位if nums[i] < nums[end] {nums.swap(small, i);small += 1;}}// 此时比x小的在[0,small),比x大的在[small,end),x在[end]// 将x换到small,此时比x小的在[0,small),x在[small], 比x大的在(small,end]nums.swap(small, end);small}
快排代码:
fn quick_sort(nums: &mut [i32]) {if nums.len() <= 1 {return;}let split_index = partition(nums);quick_sort(&mut nums[0..split_index]);let end = nums.len();quick_sort(&mut nums[split_index + 1..end]);}
