MCPcopy Create free account
hub / github.com/QMHTMY/RustBook / merge_force_collapse

Method merge_force_collapse

publication/code/chapter07/tim_sort.rs:619–650  ·  view source on GitHub ↗

集合处理完了就强制合并剩余的 run 到只剩下一个 run

(&mut self)

Source from the content-addressed store, hash-verified

617
618 // 集合处理完了就强制合并剩余的 run 到只剩下一个 run
619 fn merge_force_collapse(&mut self) {
620 let runs = &mut self.runs;
621 while runs.len() > 1 {
622 let n = runs.len() - 2;
623
624 // 三个连续的 run: A、B、C,判断其长度关系并进行合并
625 // n - 1 对应 A、 n 对应 B、n + 1 对应 C
626 let (pos1, pos2) = if n > 0 && runs[n - 1].len < runs[n + 1].len {
627 (n - 1, n)
628 } else {
629 (n, n + 1)
630 };
631
632 // 取出待合并的 run1 和 run2
633 let (run1, run2) = (runs[pos1], runs[pos2]);
634 debug_assert_eq!(run1.len, run2.pos);
635
636 // 合并 run1 和 run2 到 run1,其实就是更新 run1 的参数并删除 run2,
637 // run1 下标不变,但合并后长度是 run1 和 run2 长度之和
638 runs.remove(pos2);
639 runs[pos1] = Run {
640 pos: run1.pos,
641 len: run1.len + run2.len,
642 };
643
644 // 取出合并后的 run1 去进行归并排序
645 let new_list = self.list
646 .split_at_mut(run1.pos).1
647 .split_at_mut(run1.len + run2.len).0;
648 merge_sort(new_list, run1.len);
649 }
650 }
651}
652
653// timSort 入口

Callers 1

sortMethod · 0.45

Calls 3

merge_sortFunction · 0.70
lenMethod · 0.45
removeMethod · 0.45

Tested by

no test coverage detected