目的
- 普通MergeSort对于原本有序或者接近有序的数组的表现不好,所以引出了Natural Mergesort。
过程
- 和MergeSort自顶向下的过程不同,Natural Mergesort选择了相反的方向。
代码
12345678910111213141516171819ForwardIterator SortedRangeEnd(ForwardIterator begin, ForwardIterator end, Comparator comp) {/* Edge case - if the input is empty, we're done. */if (begin == end) return end;/* Get an iterator that's one step ahead of begin. */ForwardIterator next = begin; ++next;/* Keep marching these iterators forward until we find a mismatch or* hit the end. A mismatch occurs when the element after the current* is strictly less than the current element.*/for (; next != end && !comp(*next, *begin); ++next, ++begin);/* The above loop stops either when next is the end of the sequence or* when next is the crossover point. In either case, return next.*/return next;}
这个函数是来找到已经排好序的范围。
|
|
稀疏平常的merge部分。
|
|
可以看到只是一个很小的更改,就能让我们成功降低mergesort最好时间复杂度,真正让mergesort更加实用了。