1. 归并算法
[dependencies]
rand = "0.8.5"
stopwatch = "0.0.7"
use rand::prelude::*;
use stopwatch::Stopwatch;
fn merge_sort(arr: &mut [i32]) {
if arr.len() > 1 {
let mid = arr.len() / 2;
merge_sort(&mut arr[..mid]);
merge_sort(&mut arr[mid..]);
merge(arr, mid);
}
}
fn merge(arr: &mut [i32], mid: usize) {
let left = arr[..mid].to_vec();
let right = arr[mid..].to_vec();
let mut l = 0;
let mut r = 0;
for data in arr {
if r == right.len() || (l < left.len() && left[l] < right[r]) {
*data = left[l];
l += 1;
} else {
*data = right[r];
r += 1;
}
}
}
fn main() {
// 创建计时器
let sw1 = Stopwatch::start_new();
// 创建随机数组
let mut rng = rand::thread_rng();
let mut nums: Vec<i32> = (1..100000).collect();
nums.shuffle(&mut rng);
println!("创建数据耗时 {}ms", sw1.elapsed_ms());
// 开始排序
let sw2 = Stopwatch::start_new();
merge_sort(&mut nums);
println!("排序耗时 {}ms", sw2.elapsed_ms());
}
2. 选择排序
struct Solution;
impl Solution {
pub fn select_sort(arr: &mut Vec<i32>) {
for i in 0..arr.len()-1 {
let mut k = i;
for j in i+1..arr.len() {
if arr[j] < arr[k] {
k = j
}
}
arr.swap(i, k);
}
}
}
fn main() {
let mut arr = vec![27, 38, 13, 49, 76, 97, 65];
Solution::select_sort(&mut arr);
println!("arr = {:?}", arr);
}
3. 冒泡排序
struct Solution;
impl Solution {
pub fn bubble_sort(arr: &mut Vec<i32>) {
for i in 0..arr.len() - 1 {
let mut change = false;
for j in 0..arr.len() - 1 - i {
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
change = true;
}
}
if !change {return;}
}
}
}
fn main() {
let mut arr = vec![27, 38, 13, 49, 76, 97, 65];
Solution::bubble_sort(&mut arr);
println!("arr = {:?}", arr);
}
4. 插入排序
struct Solution;
impl Solution {
pub fn insert_sort(arr: &mut Vec<i32>) {
for i in 1..arr.len() {
let mut j = i;
while j > 0 {
if arr[j] < arr[j - 1] {
arr.swap(j, j - 1);
}
j -= 1;
}
}
}
}
fn main() {
let mut arr = vec![27, 38, 13, 49, 76, 97, 65];
Solution::insert_sort(&mut arr);
println!("arr = {:?}", arr);
}