- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到 C++ 对其内置的 std::sort 使用 introsort(内省(introspection)排序),它从快速排序开始,并在达到深度限制时切换到堆排序。
我还读到深度限制应该是 2*log(2,N)。
这个值纯粹是实验性的吗?或者它背后有一些数学理论?
最佳答案
如果你有一个区间(范围或数组),在你得到一个空(或一个元素)区间之前你必须将区间分成两半的次数是 log(2,N)
,这只是一个数学事实,如果你愿意,你可以很容易地计算出来。如果快速排序一切顺利,它应该递归 log(2,N)
次,出于同样的原因(并且在每个递归级别,它必须处理间隔的所有值,这导致整个算法的复杂度为 O(N*log(2,N))
)。问题是快速排序可能需要更多的递归(如果它在选择枢轴值时一直“不走运”,这意味着它不会将间隔分成两半,而是以一种不平衡的方式)。更糟糕的是,快速排序最终可能会递归 N 次,这对于生产质量的实现来说绝对是 Not Acceptable 。
在 2*log(2,N)
切换到堆排序一般而言,这只是一个很好的启发式方法,可以检测到过多的递归。
从技术上讲,您可以根据堆排序与快速排序的经验性能来确定最佳限制。但是这样的测试高度依赖于应用程序(你在排序什么?你如何比较元素?元素交换有多便宜?等等)。所以,大多数一刀切的实现,比如 std::sort
, 只会选择一个合理的限制,例如 2*log(2,N)
.
关于c++ - Introsort (quicksort + heapsort) 实现和复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246430/
Introsort从快速排序开始,当递归深度超过基于被排序元素数量的级别时切换到堆排序。那个数字是多少?有没有具体的范围或限值? 最佳答案 Introsort algorithm从 Quicksort
我知道当使用 T[] 之类的东西调用 IntroSort 时,请说 Integer[] x;它将对数组进行排序,直到递归深度太多(在大多数实现中为 0),然后它将切换到 HeapSort。但是,当递归
我读到 C++ 对其内置的 std::sort 使用 introsort(内省(introspection)排序),它从快速排序开始,并在达到深度限制时切换到堆排序。 我还读到深度限制应该是 2*lo
我正在用 C++ 编写一个简单的就地 introsort,其中我试图在分区函数中手动展开一个循环以进行优化。我将在下面包含的程序可以编译,但无法正确排序随机列表。 这个程序正在为 RISC-V 架构向
尝试使用 Python 实现 Introsort。 给出的伪代码是: 1 n ←|A| 2 if n ≤ 1 3 return 4 elseif d = 0 5 Heap-Sort(A) 6 else
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我不太了解 Introsort 算法。如您所见,我添加了它的伪代码。最大深度是什么意思? “⌊log(length(A))⌋ × 2”是什么意思 希望有人能给我解释一下。 procedure sor
我一直在挑选和探索 Swift Array 的排序函数,我惊讶地发现对 500,000 个整数的数组进行就地排序比对 500,000 个元组的数组排序快得多(快 5 倍)。我对这一发现感到惊讶,因为在
List.Sort 的 .NET 文档提到渐近运行时:https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.l
我是一名优秀的程序员,十分优秀!