rust-algorithms:11-快速排序

pub fn quick_sort<T: PartialOrd>(arr: &mut [T]) {
    let len = arr.len();
    if len > 1  {
        quick_sort_range(arr, 0, len - 1);
    }
}

fn quick_sort_range<T: PartialOrd>(arr: &mut[T], low: usize, high:usize) {
    if low < high {
        let partition =  partition(arr, low, high);
        if partition > 0 {
            quick_sort_range(arr, low, partition);
        }
        quick_sort_range(arr, partition + 1, high)
    }
}

fn partition<T: PartialOrd>(arr: &mut [T], low: usize, high: usize) -> usize {
    use rand::Rng;
    // 随机数增加效率
    let r = rand::thread_rng().gen_range(low..=high);
    arr.swap(low, r);

    let (
        // 选取的值左边必定小于等于该值,可以放在最左端躲藏,避免重复移动
        pivot,
        mut left,
        mut right
    ) = (
        low,
        low,
        high
    );
    while left < right {
        while left < right && arr[right] > arr[pivot] {
            right -= 1;
        }
        while left < right && arr[left] <= arr[pivot] {
            left += 1;
        }
        // 交换两端的差异值
        if left != right {
            arr.swap(left, right);
        }
    }
    // 选取的值放在最中间,保证分割线
    arr.swap(pivot, left);
    left
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!