sort/
lib.rs

1pub fn bubble_sort<T: PartialOrd>(list: &mut [T]) {
2    let size = list.len();
3    for i in 0..(size - 1) {
4        let mut swapped = false;
5        for j in 0..(size - 1 - i) {
6            if list[j] > list[j + 1] {
7                list.swap(j, j + 1);
8                swapped = true;
9            }
10        }
11        if !swapped {
12            break;
13        }
14    }
15}
16
17pub fn selection_sort<T: PartialOrd>(list: &mut [T]) {
18    let size = list.len();
19    for i in 0..(size - 1) {
20        let mut min_index = i;
21        for j in (i + 1)..(size) {
22            if list[j] < list[min_index] {
23                min_index = j;
24            }
25        }
26        list.swap(min_index, i);
27    }
28}
29
30pub fn insertion_sort<T: PartialOrd + Copy>(list: &mut [T]) {
31    for i in 1..(list.len()) {
32        let key = list[i];
33        let mut j = (i - 1) as i32;
34        while j >= 0 && list[j as usize] > key {
35            list[(j + 1) as usize] = list[j as usize];
36            j -= 1;
37        }
38        list[(j + 1) as usize] = key;
39    }
40}
41
42fn merge<T: PartialOrd + Copy>(first_half: &[T], second_half: &[T], list: &mut [T]) {
43    let s1 = first_half.len();
44    let s2 = second_half.len();
45    let mut i1 = 0_usize;
46    let mut i2 = 0_usize;
47    let mut counter = 0_usize;
48    loop {
49        if i1 >= s1 {
50            while i2 < s2 {
51                list[counter] = second_half[i2];
52                i2 += 1;
53                counter += 1;
54            }
55            break;
56        } else if i2 >= s2 {
57            while i1 < s1 {
58                list[counter] = first_half[i1];
59                i1 += 1;
60                counter += 1;
61            }
62            break;
63        }
64        if first_half[i1] <= second_half[i2] {
65            list[counter] = first_half[i1];
66            i1 += 1;
67        } else {
68            list[counter] = second_half[i2];
69            i2 += 1;
70        }
71        counter += 1;
72    }
73}
74
75pub fn merge_sort<T: PartialOrd + Copy>(list: &mut [T]) {
76    let mid = list.len() / 2;
77    if mid == 0 {
78        return;
79    }
80    merge_sort(&mut list[..mid]);
81    merge_sort(&mut list[mid..]);
82
83    let mut res = list.to_vec();
84    merge(&list[..mid], &list[mid..], &mut res);
85
86    list.copy_from_slice(&res);
87}
88
89fn partition<T: PartialOrd + Copy>(list: &mut [T], left_most: i32, right_most: i32) -> i32 {
90    let pivot = list[right_most as usize];
91    let mut i = left_most - 1;
92    let rm_usize = right_most as usize;
93    let lm_usize = left_most as usize;
94
95    for j in lm_usize..(rm_usize + 1) {
96        if list[j] < pivot {
97            i += 1;
98            list.swap(i as usize, j);
99        }
100    }
101    list.swap((i + 1) as usize, rm_usize);
102    return i + 1;
103}
104
105fn recursive_quick_sort<T: PartialOrd + Copy>(list: &mut [T], left_most: i32, right_most: i32) {
106    if left_most < right_most {
107        let p_index = partition(list, left_most, right_most);
108        recursive_quick_sort(list, left_most, p_index - 1);
109        recursive_quick_sort(list, p_index + 1, right_most);
110    }
111}
112
113pub fn quick_sort<T: PartialOrd + Copy>(list: &mut [T]) {
114    recursive_quick_sort(list, 0, list.len() as i32 - 1);
115}
116
117#[cfg(test)]
118mod tests {
119    use super::*;
120    #[test]
121    fn test_bubble_sort() {
122        let mut v = [3, 2, 5, 6, 1, 4];
123        bubble_sort(&mut v);
124        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
125    }
126
127    #[test]
128    fn test_selection_sort() {
129        let mut v = [4, 6, 3, 1, 5, 2];
130        selection_sort(&mut v);
131        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
132    }
133
134    #[test]
135    fn test_insertion_sort() {
136        let mut v = [1, 5, 3, 6, 2, 4];
137        insertion_sort(&mut v);
138        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
139    }
140
141    #[test]
142    fn test_merge_sort() {
143        let mut v = [2, 3, 4, 1, 6, 5];
144        merge_sort(&mut v);
145        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
146    }
147
148    #[test]
149    fn test_quick_sort() {
150        let mut v = [6, 1, 2, 5, 4, 3];
151        quick_sort(&mut v);
152        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
153    }
154}