1
+ /*
2
+
3
+ INSERTION SORT
4
+
5
+ */
1
6
pub fn insertion_sort ( input : Vec < i32 > ) -> Vec < i32 > {
2
7
let mut sorted: Vec < i32 > = input;
3
-
4
8
for j in 1 ..sorted. len ( ) {
5
9
let key: i32 = sorted[ j] ;
6
10
let mut i: usize = j;
@@ -10,10 +14,70 @@ pub fn insertion_sort(input: Vec<i32>) -> Vec<i32> {
10
14
}
11
15
sorted[ i] = key;
12
16
}
17
+ return sorted;
18
+ }
19
+
20
+ /*
21
+
22
+ MERGE SORT
13
23
24
+ */
25
+ pub fn merge_sort ( input : Vec < i32 > , left : usize , right : usize ) -> Vec < i32 > {
26
+ let mut sorted: Vec < i32 > = input;
27
+ if left < right {
28
+ let middle: usize = left + ( right - left) / 2 ;
29
+ sorted = merge_sort ( sorted, left, middle) ;
30
+ sorted = merge_sort ( sorted, middle + 1 , right) ;
31
+ sorted = merge ( sorted, left, middle, right) ;
32
+ }
14
33
return sorted;
15
34
}
16
35
36
+ fn merge ( input : Vec < i32 > , left : usize , middle : usize , right : usize ) -> Vec < i32 > {
37
+ let mut sorted: Vec < i32 > = input;
38
+ let n1: usize = middle - left + 1 ;
39
+ let n2: usize = right - middle;
40
+ let mut left_vec: Vec < i32 > = vec ! [ -1 ; n1] ;
41
+ let mut right_vec: Vec < i32 > = vec ! [ -1 ; n2] ;
42
+ for i in 0 ..n1 {
43
+ left_vec[ i] = sorted[ left + i] ;
44
+ }
45
+ for j in 0 ..n2 {
46
+ right_vec[ j] = sorted[ middle + j + 1 ] ;
47
+ }
48
+ let mut i: usize = 0 ;
49
+ let mut j: usize = 0 ;
50
+ let mut k: usize = left;
51
+ while i < n1 && j < n2 {
52
+ if left_vec[ i] <= right_vec[ j] {
53
+ sorted[ k] = left_vec[ i] ;
54
+ i = i + 1 ;
55
+ } else {
56
+ sorted[ k] = right_vec[ j] ;
57
+ j = j + 1 ;
58
+ }
59
+ k = k + 1 ;
60
+ }
61
+ while i < n1 {
62
+ sorted[ k] = left_vec[ i] ;
63
+ i = i + 1 ;
64
+ k = k + 1 ;
65
+ }
66
+ while j < n2 {
67
+ sorted[ k] = right_vec[ j] ;
68
+ j = j + 1 ;
69
+ k = k + 1 ;
70
+ }
71
+ return sorted;
72
+ }
73
+
74
+ /*
75
+
76
+ UTILITY FUNCTIONS
77
+
78
+ */
79
+ // function only used to validate if inputs are sorted
80
+ #[ allow( dead_code) ]
17
81
fn is_sorted ( input : Vec < i32 > ) -> bool {
18
82
let mut last_num = 0 ;
19
83
for num in input {
@@ -28,6 +92,7 @@ fn is_sorted(input: Vec<i32>) -> bool {
28
92
#[ cfg( test) ]
29
93
mod tests {
30
94
use super :: insertion_sort;
95
+ use super :: merge_sort;
31
96
use super :: is_sorted;
32
97
33
98
const INPUTS : [ [ i32 ; 5 ] ; 5 ] = [ [ 1 , 2 , 3 , 4 , 5 ] , [ 5 , 4 , 3 , 2 , 1 ] , [ 1 , 1 , 1 , 2 , 3 ] , [ 5 , 1 , 4 , 2 , 3 ] , [ 5 , 1 , 2 , 5 , 5 ] ] ;
@@ -47,4 +112,13 @@ mod tests {
47
112
assert_eq ! ( is_sorted( sorted) , true ) ;
48
113
}
49
114
}
115
+
116
+ #[ test]
117
+ fn test_merge_sort ( ) {
118
+ for i in 0 ..INPUTS . len ( ) {
119
+ let sorted: Vec < i32 > = merge_sort ( INPUTS [ i] . to_vec ( ) , 0 , INPUTS [ i] . len ( ) - 1 ) ;
120
+ println ! ( "{sorted:?}" ) ;
121
+ assert_eq ! ( is_sorted( sorted) , true ) ;
122
+ }
123
+ }
50
124
}
0 commit comments