gpt4 book ai didi

c++ - 创建最小堆的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:53:35 26 4
gpt4 key购买 nike

我在考试中遇到了这个问题,但我不确定我是否理解它要我做什么。如果我做对了,你能澄清一下吗?

问题

一个整数数组 A 被传递给函数 makeHeap。如果 A[0] 包含 n,则 A[1] 到 A[n-1] 包含任意顺序的数字。编写 makeHeap 使得 A[1] 到 A[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 ;
}
}

最佳答案

您的代码不会堆化数组(忽略 aboolean 等错误)

对于 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) 自下而上的构造。

关于c++ - 创建最小堆的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43601524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com