tl; dr:是否可以有效地在双向链表上实现快速排序?在考虑之前我的理解是,不,不是。
前几天我有机会考虑基本排序算法的迭代器要求。基本的 O(N²) 相当简单。
- 冒泡排序 - 2 个前向迭代器会做得很好,一个接一个拖着。
- 插入排序 - 2 个双向迭代器就可以了。一个用于乱序元素,一个用于插入点。
- 选择排序 - 有点棘手,但前向迭代器可以解决问题。
快速排序
std::sort 中的 introsort_loop(如在 gnu 标准库/hp(1994)/silicon graphics(1996) 中)要求它是 random_access。
__introsort_loop(_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Size __depth_limit, _Compare __comp)
正如我所期待的那样。
现在经过仔细检查,我找不到需要快速排序的真正原因。唯一明确需要 random_access_iterators 的是std::__median
需要计算中间元素的调用。常规的香草快速排序不计算中位数。
分区包括一个检查
if (!(__first < __last))
return __first;
不是真正有用的双向检查。然而,人们应该能够用一个简单的条件来替换前一个分区旅行(从左到右/从右到左)中的检查
if ( __first == __last ) this_partitioning_is_done = true;
是否可以仅使用双向迭代器相当有效地实现快速排序?递归深度仍然可以被保护。
注意。我还没有尝试过实际的实现。