alxolr

# Mergesort implemented in rust language

## Intro

In this article, I've explained how mergesort works and also provided an implementation in rust language.

## Mergesort Algorithm

Mergesort it's another divide-and-conquer algorithm similar to quicksort. The algorithm consists of two steps:

1. Divide the array to be merged into halves till the resulting array it's of size one.

2. The second step is to apply bottom up `merging` procedure which works as follow:

• we compare the first element from each array to be merged; the smallest will be included in a new merged array, and removed from the partitioned array.

• we repeat the procedure till there are no more elements in any of the arrays to be merged.

## Analysis

Time complexity of `mergesort` is `O(nlogn)` in all cases. Space complexity is `O(n)` we will need an extra array to store the merged parts from left and right.

## Implementation in rust

``````pub fn mergesort<T: PartialOrd + Copy>(arr: &mut [T]) {
_mergesort(arr, 0, arr.len() - 1);
}``````
``````fn _mergesort<T: PartialOrd + Copy>(arr: &mut [T], left: usize, right: usize) {
if left < right {
let mid = (left + right) / 2;
_mergesort(arr, left, mid);
_mergesort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}``````
``````fn merge<T: PartialOrd + Copy>(arr: &mut [T], left: usize, mid: usize, right: usize) {
let left_arr = &arr[left..=mid].to_owned();
let right_arr = &arr[mid + 1..=right].to_owned();

let mut i = 0;
let mut j = 0;

for k in left..=right {
if i < left_arr.len() && j < right_arr.len() {
if left_arr[i] < right_arr[j] {
arr[k] = left_arr[i];
i += 1;
} else {
arr[k] = right_arr[j];
j += 1;
}
} else if i >= left_arr.len() {
arr[k] = right_arr[j];
j += 1;
} else {
arr[k] = left_arr[i];
i += 1;
}
}
}``````