Skip to content

Commit e74fa48

Browse files
committed
add merge sort
1 parent a6960b1 commit e74fa48

File tree

4 files changed

+106
-1
lines changed

4 files changed

+106
-1
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "merge_sort"
3+
version = "0.1.0"
4+
authors = ["jameskk <[email protected]>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
fn main() {
2+
let mut a = [12,232,234,2,34,234,234,2,34,2,34,234,234,2,34,234,2,34,2,34,234,2,34,2];
3+
merge_sort_1(&mut a);
4+
for i in &a {
5+
println!("{}", i);
6+
}
7+
}
8+
9+
pub fn merge_sort_1(arr: &mut [i32]) {
10+
// let x = [1, 2, 3];
11+
let mut tmp: Vec<i32> = Vec::new();
12+
let mut l = arr.len();
13+
while l > 0 {
14+
tmp.push(0i32);
15+
l-=1;
16+
}
17+
let len = arr.len();
18+
merge_core(arr, &mut tmp, 0, (len - 1) as usize);
19+
}
20+
fn merge_core(arr: &mut [i32], tmp: &mut [i32], start: usize, end: usize) {
21+
if start >= end {
22+
return;
23+
}
24+
let mid = start + ((end - start) >> 1);
25+
merge_core(arr, tmp, start, mid);
26+
merge_core(arr, tmp, mid + 1, end);
27+
merge(arr, tmp, start, mid, end);
28+
}
29+
30+
fn merge(arr: &mut [i32], tmp: &mut [i32], start: usize, mid: usize, end: usize) {
31+
let mut i1 = start;
32+
let mut i2 = mid + 1;
33+
let mut i = 0;
34+
while i1 <= mid && i2 <= end {
35+
if arr[i1] <= arr[i2] {
36+
tmp[i] = arr[i1];
37+
i1+=1;
38+
} else {
39+
tmp[i] = arr[i2];
40+
i2+=1;
41+
}
42+
i+=1;
43+
}
44+
while i1 <= mid {
45+
tmp[i] = arr[i1];
46+
i+=1;
47+
i1+=1;
48+
}
49+
while i2 <= end {
50+
tmp[i] = arr[i2];
51+
i+=1;
52+
i2+=1;
53+
}
54+
55+
let len = i;
56+
i = 0;
57+
while i < len {
58+
arr[start + i] = tmp[i];
59+
i+=1;
60+
}
61+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
pub fn merge_sort<T> (list: &[T]) -> Vec<T>
2+
where: T: PartialOrd + Clone + Debug>
3+
{
4+
if list.len() > 1 {
5+
let (l, r) = list.split_at(list.len() / 2);
6+
let sorted_l = merge_sort(l);
7+
let sorted_r = merge_sort(r);
8+
let mut rst: Vec<T> = list.into();
9+
let (mut i, mut j, mut k) = (0, 0, 0);
10+
while i < sorted_l.len() && j < sorted_r.len() {
11+
if sorted_l[i] <= sorted_r[j] {
12+
rst[k] = sorted_l[i].clone();
13+
i += 1;
14+
} else {
15+
rst[k] = sorted_r[j].clone();
16+
j += 1;
17+
}
18+
k += 1;
19+
}
20+
while i < sorted_l.len() {
21+
rst[k] = sorted_l[i].clone();
22+
k += 1;
23+
i += 1;
24+
}
25+
26+
while j < sorted_r.len() {
27+
rst[k] = sorted_r[j].clone();
28+
k += 1;
29+
j += 1;
30+
}
31+
rst
32+
} else {
33+
list.to_vec()
34+
}
35+
}

code/examples/sort/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pub fn merge_sort_1(arr: &mut [i32]) {
2-
let tmp = [0i32; (arr.len() - 1)];
2+
let tmp = [0i32; (arr.len() - 1) as usize];
33
}
44
fn merge_core(arr: &mut [i32], tmp: &mut [i32], start: usize, end: usize) {
55
if start >= end {

0 commit comments

Comments
 (0)