- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道当使用 T[] 之类的东西调用 IntroSort 时,请说 Integer[] x;它将对数组进行排序,直到递归深度太多(在大多数实现中为 0),然后它将切换到 HeapSort。但是,当递归深度变为 2log2n 时,我尝试调用修改后的 MergeSort。修改后的MergeSort只使用了原数组一半大小的临时数组,只是为了节省一点时间和空间。不管怎样,我基本上已经复制了所有的 QuickSort,除了在递归调用之前添加了深度限制检查。
private void quicksort(T[] items, int left, int right) {
int depth_limit = (int) (2*Math.log(items.length));
if(depth_limit == 0)
{
mergesorter.sort(items, left, right);
return;
}
int pivotindex = findpivot(items, left, right);
// curr will be the final position of the pivot item.
int curr = partition(items, left, right, pivotindex);
if ((curr - left) > 1) {
quicksort(items, left, curr - 1); // Sort left partition
}
if ((right - curr) > 1) {
quicksort(items, curr + 1, right); // Sort right partition
}
}
我认为这会起作用,因为我相信
深度限制 = 2*log2(n),其中 n 是输入数量
所以我的问题是,我在哪里检查递归深度以切换到合并排序以及我是否正确计算了我的深度?
最佳答案
深度限制通常作为参数传递,并带有一个条目/辅助函数,该函数使用深度限制的初始值调用快速排序()。 Wiki 有一个示例,sort() 是将深度限制传递给 Quicksort() 的辅助函数:
http://en.wikipedia.org/wiki/Introsort
items.length 不会改变。如果需要,使用 (right - left)+1 获取当前子数组的长度。
请注意,快速排序的最坏情况是长度为 m 的子数组被分成两个子数组,一个长度为 1,一个长度为 m-1,除非排除主元,在这种情况下是最坏情况递归的长度是 1 和 m-2(枢轴已经在正确的位置)。
合并排序只需将子数组从 &T[左] 排序到 &T[右]。
自上而下或自下而上的合并排序都可以使用原始数组大小 1/2 的工作数组,方法是对原始数组的两半进行排序,然后将数组的前半部分复制到工作数组,然后执行以下操作将工作数组和原始数组的后半部分最终合并回原始数组(对于奇数大小的原始数组,工作数组和“前”半数组大小为 n/2 + 1)。
关于java - 从 IntroSort 转到 MergeSort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391702/
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
我是一名优秀的程序员,十分优秀!