简介
对数组 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");
}
// 随机选择一个元素x
let 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]);
}