用于创建Min-Heap的算法
Algorithm for creating min-heap
我在考试中得到了这个问题,但我不确定我是否理解它要我做什么。您能澄清一下,如果我做了正确的事情?
问题
整数数组A被传递到函数makeHeap
。如果a [0]包含n,则a [1]到a [n-1]包含任意顺序的数字。将makeHeap
写入[1]到[N-1]中包含一个分钟。您的功能必须通过按顺序a [2],a [3],...,a [n-1]的顺序处理元素来创建堆。
我的解决方案
void makeHeap(int A[], int n)
{
int r = n -1 ;
for(int i = 1; i <= n/2; i++)
siftUp(a, i , r );
}
/* i- parent , r - right of the array */
void siftUp(int A[], int i , int r )
{
boolean done = false ;
int j = 2* i ;
while (j <= r && !done)
{
if(A[j] > A[j+1]) // find the smalest child
j+=1 ;
if(A[i] > A[j])
{
// code to swap A[i] and A[j]
i = j ;
j = i*2 ;
}
else done = true ;
}
}
这个解决方案甚至正确吗?另外, siftUp
函数的正确名称?
编辑:
我的新解决方案
void makeHeap(int A[], int n)
{
for(int i = 1; i <= A[0]/2; i++)
siftUp(A, i );
}
/* i- parent */
void siftUp(int A[], int i )
{
bool done = false ;
int j = 2* i ;
while (i > 1 && !done)
{
if(A[j] > A[j+1]) // find the smallest child
j+=1 ;
if(A[i] > A[j])
{
/* swap A[j] and A[i] */
int temp = A[i];
A[i] = A[j];
A[j] = temp ;
j = i ;
i = i / 2 ;
}
else done = true ;
}
}
您的代码不会堆积数组(忽略诸如a
和boolean
之类的错误(
对于Siftup((,请记住属性parent(i) = i/2
,其中i
是节点的索引。一些用于将节点插入堆中的伪代码(作为堆的最后一个节点(:
Algo siftUp(H[], n)
i = n
while i > 1 and H[i] < H[i/2]
swap(H[i], H[i/2])
i = i / 2
这将导致o(nlogn(在您的数组中迭代时,但是使用o(n(的底部构造有更好的方法。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 如何使用std::min和std::less返回对象
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 使用`std :: min`作为算法参数
- 用于创建Min-Heap的算法
- Min-Heap,基于零的数组C
- 在C++中实现 Heap 算法