Heapsort - Percolate-down / Shift-down和Heapify操作之间的区别/关系是什么?

时间:2012-02-28 07:56:57

标签: c heapsort

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的算法是什么?

2 个答案:

答案 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)