rust-algorithms:11-快速排序

godme發表於2022-07-26
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 協議》,轉載必須註明作者和本文連結

相關文章