提问人:Donny Chan 提问时间:10/21/2021 最后编辑:Donny Chan 更新时间:10/23/2021 访问量:108
什么算法满足C++“std::stable_sort”的复杂度要求?
What algorithm meets the complexity requirements of the C++ `std::stable_sort`?
问:
www.cppreference.com 的文档说 std::stable_sort()
的复杂性是
O(n * log(n)^2) [...].如果有额外的内存可用,则复杂度为 O(n * log(n))。
什么算法可以满足这一要求,指定的“附加内存”是多少?
答:
0赞
Donny Chan
10/23/2021
#1
根据该问题的评论者和一些进一步的阅读,之所以指定复杂性,是因为没有平凡的稳定就地 O(nlogn) 排序算法。通过对源代码的进一步检查,和 的实现是相似的,两者都是合并排序,其中就地合并的复杂度为 O(nlogn)。至于“附加内存”,这两个库需要 N 个额外的内存,其中 N 是数组的长度。libc++
libstdc++
更具体地说,不是线性扫描两个子数组并一次合并一个元素,而是就地合并搜索一种方式将两个子数组中的每一个划分为两个部分(总共四个部分),这样在交换中间两个部分时,最左边两个部分中的所有元素都小于或等于最右边的两个部分。然后,他们分别在最左边和最右边的两个部分执行就地合并。
评论
inplace_merge
有一个众所周知的线性时间+线性空间实现,也有一个众所周知的对数线性时间+对数空间实现,并且该标准至少需要一些好的东西