Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

‎labocédai/src/lib.rs

Lines changed: 29 additions & 0 deletions
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
}

‎labocédai/src/sort.rs

Lines changed: 24 additions & 15 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /