算法 / 排序

use chrono::Duration;

// Time Complexity from O(n log(n)) to O(n^2)
// Space Complexity O(log(n))

fn do_sort(items: &mut [i32], fst: usize, lst: usize)
{
    if fst >= lst {
        return;
    }
    let mut i = fst;
    let mut j = lst;
    let x = items[(fst + lst)/2];

    while i < j {
        while items[i] < x { i+=1 }
        while items[j] > x { j-=1 }
        if i <= j {
            let tmp = items[i];
            items[i] = items[j];
            items[j] = tmp;
            i += 1;
            if j > 0 { j -= 1 }
        }
    }
    do_sort(items, fst, j);
    do_sort(items, i, lst);
}

fn sort(items: &mut [i32]) {
    do_sort(items, 0, items.len() - 1);
}

let mut nums = [ 41532 ];

sort(&mut nums);
// sortItems is {1, 2, 3, 4, 5}
println!("nums is {:?}", nums);

// *** simplified speed test ***

let mut items = [0i32200];
for i in 0..items.len() {
    items[i] = i as i32;
}
let tmp = items[5];
items[5] = items[6];
items[6] = tmp;
let count = 1000;

let start = chrono::offset::Utc::now();

for _ in 1..count {
    sort(&mut items);
}

let now = chrono::offset::Utc::now();
let delta: Duration = now - start;

println!("milliseconds is {}"
    delta.num_milliseconds());    
println!("items is {:?}", items);
// about 7 milliseconds