在C中实现Min Heap - 使用数组?

时间:2012-09-29 16:00:23

标签: c binary-tree min-heap

我正在尝试学习并实现一个小堆来解决问题:Loop that creates doubles and insert them into sorted array, in C

基本上,我从一组双打开始,从最小到最大排序。然后,我生成双打(可能是随机的)并且必须将新生成的双打添加到集合中,同时保持其排序。另外,每次插入一个double时,我都会从集合中删除最小的双精度。

编辑 - 该集合不必完全排序。目标是能够在每次插入双精度后查找并删除最小元素。保持集合排序为我的第一个天真的解决方案。)

听起来像是做了一个小堆的事情。

尝试

因为在C中,数组大小是事先声明的,所以我必须创建一个数组,其长度=我将最终得到的最大双精度数。然后,使用值max_double填充此数组的所有条目。

使用此处描述的方法作为指南:http://opendatastructures.org/versions/edition-0.1e/ods-java/10_1_BinaryHeap_Implicit_Bi.html,我可以创建函数来插入和删除此数组中的值。

插入:用数字替换数组的最后一个条目(总是max_double)。然后继续交换父节点的值,直到父节点的值小于新添加的值。

删除:用max_double替换根节点,然后将其与两个子节点进行比较,与最少的子节点交换,直到其两个子节点为max_double。

问题

我是否正确使用所有这些方法?

1 个答案:

答案 0 :(得分:4)

堆不会使数组排序。它只是遵循规则,这意味着在最小堆中,父母将永远小于他的孩子。不幸的是,孩子们不必整理好。

如果你想在数组中实现一个堆,wiki有一个很棒的页面。

http://en.wikipedia.org/wiki/Binary_heap

更多解释:

插入: 将元素添加到数组的末尾(不替换!) 如果订单正确停止,则将元素与(i-1/2)处的父元素进行比较。 否则交换并再次执行第2步。 (记得更新当前索引)

删除: 使用数组中的最后一个元素交换min 删除最后一个元素 现在从顶部开始,将根与其子项进行比较,与最小的交换,否则停止。 继续与孩子比较,直到病情满足或者你没有其他孩子。

对于从0开始的指数,父母在场((i-1)/ 2),孩子在2i + 1和2i + 2

还有一件事,我建议使用双端队员来存储你的双打。

相关问题