Skip to content

Commit 8444fda

Browse files
committed
Add merge_sort to sort.rs
1 parent d59bb3a commit 8444fda

File tree

2 files changed

+53
-15
lines changed

2 files changed

+53
-15
lines changed

Diff for: labocédai/src/lib.rs

+29
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ mod tests {
143143
bubble_sort(&mut [29, 10, 14, 30, 37, 14, 18]),
144144
[10, 14, 14, 18, 29, 30, 37]
145145
);
146+
assert_eq!(
147+
bubble_sort(&mut [-1, -2, 1, 0]),
148+
[-2, -1, 0, 1]
149+
);
146150
assert_eq!(bubble_sort(&mut []), []);
147151
assert_eq!(bubble_sort(&mut [1, 1, 1, 2, 1]), [1, 1, 1, 1, 2]);
148152
assert_eq!(bubble_sort(&mut [2, 1, 1, 1, 2]), [1, 1, 1, 2, 2]);
@@ -155,6 +159,10 @@ mod tests {
155159
selection_sort(&mut [29, 10, 14, 30, 37, 14, 18]),
156160
[10, 14, 14, 18, 29, 30, 37]
157161
);
162+
assert_eq!(
163+
selection_sort(&mut [-1, -2, 1, 0]),
164+
[-2, -1, 0 ,1]
165+
);
158166
assert_eq!(selection_sort(&mut []), []);
159167
assert_eq!(selection_sort(&mut [1, 1, 1, 2, 1]), [1, 1, 1, 1, 2]);
160168
assert_eq!(selection_sort(&mut [2, 1, 1, 1, 2]), [1, 1, 1, 2, 2]);
@@ -167,6 +175,10 @@ mod tests {
167175
insertion_sort(&mut [29, 10, 14, 30, 37, 14, 18]),
168176
[10, 14, 14, 18, 29, 30, 37]
169177
);
178+
assert_eq!(
179+
insertion_sort(&mut [-1, -2, 1, 0]),
180+
[-2, -1, 0, 1]
181+
);
170182
assert_eq!(insertion_sort(&mut []), []);
171183
assert_eq!(insertion_sort(&mut [1, 1, 1, 2, 1]), [1, 1, 1, 1, 2]);
172184
assert_eq!(insertion_sort(&mut [2, 1, 1, 1, 2]), [1, 1, 1, 2, 2]);
@@ -179,5 +191,22 @@ mod tests {
179191
assert_eq!(merge(&[], &[]), vec![]);
180192
assert_eq!(merge(&[1, 3, 5], &[2, 4, 6]), vec![1, 2, 3, 4, 5, 6]);
181193
}
194+
195+
#[test]
196+
fn test_merge_sort() {
197+
assert_eq!(
198+
merge_sort(&mut [29, 10, 14, 30, 37, 14, 18]),
199+
[10, 14, 14, 18, 29, 30, 37]
200+
);
201+
assert_eq!(
202+
merge_sort(&mut [-1, -2, 1, 0]),
203+
[-2, -1, 0, 1]
204+
);
205+
assert_eq!(merge_sort(&mut []), []);
206+
assert_eq!(merge_sort(&mut [1, 1, 1, 2, 1]), [1, 1, 1, 1, 2]);
207+
assert_eq!(merge_sort(&mut [2, 1, 1, 1, 2]), [1, 1, 1, 2, 2]);
208+
assert_eq!(merge_sort(&mut [1]), [1]);
209+
}
210+
182211
}
183212
}

Diff for: labocédai/src/sort.rs

+24-15
Original file line numberDiff line numberDiff line change
@@ -43,29 +43,38 @@ pub fn insertion_sort(nums: &mut [isize]) -> &mut [isize] {
4343
nums
4444
}
4545

46-
pub fn merge(first_arr: &[isize], second_arr: &[isize]) -> Vec<isize> {
46+
pub fn merge(arr_1: &[isize], arr_2: &[isize]) -> Vec<isize> {
4747
/* merges two similarly sorted arrays */
48-
let mut merged = Vec::with_capacity(first_arr.len() + second_arr.len());
48+
let mut merged = Vec::with_capacity(arr_1.len() + arr_2.len());
4949
let mut i = 0;
5050
let mut j = 0;
51-
while i < first_arr.len() && j < second_arr.len() {
52-
if first_arr[i] <= second_arr[j] {
53-
merged.push(first_arr[i]);
51+
while i < arr_1.len() && j < arr_2.len() {
52+
if arr_1[i] <= arr_2[j] {
53+
merged.push(arr_1[i]);
5454
i += 1;
55-
} else if first_arr[i] > second_arr[j] {
56-
merged.push(second_arr[j]);
55+
} else if arr_1[i] > arr_2[j] {
56+
merged.push(arr_2[j]);
5757
j += 1;
5858
}
5959
}
6060
// push remaining values in unexhausted array into merged
61-
if i < first_arr.len() {
62-
for num in first_arr.iter().skip(i) {
63-
merged.push(*num);
64-
}
65-
} else if j < second_arr.len() {
66-
for num in second_arr.iter().skip(j) {
67-
merged.push(*num);
68-
}
61+
while i < arr_1.len() {
62+
merged.push(arr_1[i]);
63+
i += 1;
64+
}
65+
while j < arr_2.len() {
66+
merged.push(arr_2[j]);
67+
j += 1;
6968
}
7069
merged
7170
}
71+
72+
pub fn merge_sort(nums: &[isize]) -> Vec<isize> {
73+
if nums.len() <= 1 {
74+
return nums.to_vec();
75+
}
76+
let midpoint = nums.len() / 2;
77+
let left = merge_sort(&nums[0..midpoint]);
78+
let right = merge_sort(&nums[midpoint..]);
79+
merge(&left, &right)
80+
}

0 commit comments

Comments
 (0)