Percolate-down / Shift-down和Heapify操作之间有什么区别?
这是我在C中的Shift-down功能。而且,我已经使用此代码实现了Heapsort。
void IterativeShiftDown(int i)
{
int leftOrRightChildIndex = EMPTY;
int currentIndex = i;
int currentElement = EMPTY;
int childElement = EMPTY;
while(HasAnyChild(currentIndex))
{
if(HasBothChild(currentIndex))
{
if(GetLeftChildElement(currentIndex) > GetRightChildElement(currentIndex))
{
leftOrRightChildIndex = GetLeftChildIndex(currentIndex);
}
else
{
leftOrRightChildIndex = GetRightChildIndex(currentIndex);
}
}
else if(HasLeftChild(currentIndex))
{
leftOrRightChildIndex = GetLeftChildIndex(currentIndex);
}
currentElement = GetElement(currentIndex);
childElement = GetElement(leftOrRightChildIndex);
if(currentElement < childElement)
{
SwapElements(currentIndex, leftOrRightChildIndex);
}
currentIndex = leftOrRightChildIndex;
}
}
我可以使用此代码创建一个Heapify()函数吗?
如果是,怎么样?
此外,使用Heapify实现Heapsort的算法是什么?
答案 0 :(得分:4)
向下移动通常是将项目插入现有堆中的操作。
heapify通常是从无序数据创建堆的操作。
扩展所提供的perreal功能......
它从中间开始,因为在数组中实现了堆的属性。堆中索引N的每个子元素都是N * 2或N * 2 + 1,因此您知道最后1/2个元素没有子元素。此外,堆中节点的子节点与父节点之间存在关系(始终更大或更小或其他),但彼此之间没有关系 - 因此叶子节点永远不需要交换。
所以它开始于中间冒泡/筛选每个元素,直到需要。
有时堆很棒。具体来说,如果您正在接收输入的方式,您可以在检索数据时自由地执行一些CPU工作(异步磁盘读取/ db获取),您可以几乎免费地逐步构建堆。
沿着这些方向,一旦你掌握了数据,如果你想填充一些用户界面或者能够以一些零碎的方式反馈结果,你就可以立即获得初始结果并且检索每个元素的成本很低。
在世界上排序数据并不是最快的;但它(就我而言)是在输入=&gt;输出阶段以及算法的处理阶段分摊分类成本的最佳方法。这通常很有用。
答案 1 :(得分:2)
是的,您可以基本上调低所有项目。 Following来自维基百科:
function heapify(a, count) is
(start is assigned the index in a of the last parent node)
start := (count - 1) / 2
while start ≥ 0 do
(sift down the node at index start to the proper place such that all nodes below
the start index are in heap order)
siftDown(a, start, count-1)
start := start - 1
(after sifting down the root all nodes/elements are in heap order)