Skip to content

Commit bca5fb3

Browse files
committed
feat(geektime_algo): add 38 divide and conquer
1 parent 31b0908 commit bca5fb3

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
fn merge_sort_count(mut nums: Vec<i32>) -> i32 {
2+
let mut count = 0;
3+
let n = nums.len() - 1;
4+
merge_sort(&mut nums, 0, n, &mut count);
5+
count
6+
}
7+
8+
fn merge_sort(nums: &mut Vec<i32>, low: usize, high: usize, count: &mut i32) {
9+
if low >= high { return; }
10+
11+
let middle = low + ((high - low) >> 1);
12+
merge_sort(nums, low, middle, count);
13+
merge_sort(nums, middle+1, high, count);
14+
15+
merge(nums, low, middle, high, count);
16+
}
17+
18+
fn merge(nums: &mut Vec<i32>,
19+
low: usize,
20+
middle: usize,
21+
high: usize,
22+
count: &mut i32) {
23+
let mut i = low;
24+
let mut j = middle + 1;
25+
let mut tmp = vec![];
26+
27+
while i <= middle && j <= high {
28+
if nums[i] <= nums[j] {
29+
tmp.push(nums[i]);
30+
i += 1;
31+
} else {
32+
// count += &(middle - i + 1);
33+
*count += (middle - i + 1) as i32;
34+
tmp.push(nums[j]);
35+
j += 1;
36+
}
37+
}
38+
39+
while i <= middle {
40+
tmp.push(nums[i]);
41+
i += 1;
42+
}
43+
44+
while j <= high {
45+
tmp.push(nums[j]);
46+
j += 1;
47+
}
48+
49+
for i in 0..=(high-low) {
50+
nums[low+1] = tmp[i];
51+
}
52+
}
53+
fn main() {
54+
let nums = vec![1, 5, 6, 2, 3, 4];
55+
let m = merge_sort_count(nums);
56+
println!("{:?}", m);
57+
}

0 commit comments

Comments
 (0)