merge

Function merge 

Source
unsafe fn merge<T, F>(v: &mut [T], mid: usize, buf: *mut T, is_less: &mut F)
where F: FnMut(&T, &T) -> bool,
Examples found in repository?
crates/competitive/src/algorithm/sort.rs (lines 139-144)
118fn merge_sort<T, F>(v: &mut [T], mut is_less: F)
119where
120    F: FnMut(&T, &T) -> bool,
121{
122    let len = v.len();
123    if len <= 1 {
124        return;
125    }
126    let mut buf = Vec::with_capacity(len / 2);
127    let mut runs: Vec<Run> = vec![];
128    let mut end = len;
129    while end > 0 {
130        let start = end - 1;
131        let mut left = Run {
132            start,
133            len: end - start,
134        };
135        end = start;
136
137        while let Some(right) = runs.pop_if(|right| left.start == 0 || right.len <= left.len) {
138            unsafe {
139                merge(
140                    &mut v[left.start..right.start + right.len],
141                    left.len,
142                    buf.as_mut_ptr(),
143                    &mut is_less,
144                );
145            }
146            left = Run {
147                start: left.start,
148                len: left.len + right.len,
149            };
150        }
151        runs.push(left);
152    }
153
154    debug_assert!(runs.len() == 1 && runs[0].start == 0 && runs[0].len == len);
155
156    #[derive(Clone, Copy)]
157    struct Run {
158        start: usize,
159        len: usize,
160    }
161}