集合处理完了就强制合并剩余的 run 到只剩下一个 run
(&mut self)
| 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 入口 |
no test coverage detected