如何在没有递归的情况下编写Max Heap代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有递归的情况下编写Max Heap代码相关的知识,希望对你有一定的参考价值。

我已经从算法书的介绍中编写了MAX-HEAPIFY(A,i)方法。现在我想用while循环编写它而不用递归。你能帮我吗?

答案

你可以使用while循环条件你的i <= HEAPSIZE并使用所有其他相同的条件,除非你找到正确的位置只是打破循环。码:-

while ( i < = heapsize) {
 le <- left(i)
 ri <- right(i)
 if (le<=heapsize) and (A[le]>A[i])
  largest <- le
 else
  largest <- i 
 if (ri<=heapsize) and (A[ri]>A[largest])
  largest <- ri
 if (largest != i)
 {
   exchange A[i] <-> A[largest]
   i <- largest
 } 
 else
  break
}             
另一答案

上面的解决方案有效,但我认为以下代码更接近递归版本

(* Code TP compatible *)
const maxDim = 1000; 
type TElem = integer;
     TArray = array[1..maxDim]of TElem

procedure heapify(var A:TArray;i,heapsize:integer);
var l,r,largest,save:integer;
    temp:TElem;
(*i - index of node that violates heap property
  l - index of left child of node with index i
  r - index of right child of node with index i
  largest - index of largest element of the triplet (i,l,r) 
  save - auxiliary variable to save the value of i 
  temp - auxiliary variable used for swapping *)   
begin
  repeat
    l:=2*i;
    r:=2*i + 1;
    if(l <= heapsize) and (A[l] > A[i]) then
       largest:=l
    else 
       largest:=i;
    if(r <= heapsize) and (A[r] > A[largest]) then
       largest:=r;
    (*Now we save the value i to check properly the termination
     condition of repeat until loop
     The value of i will be modified soon in the if statement *)
    save:=i;
    if largest <> i then
    begin
      temp:=A[i];
      A[i]:=A[largest];
      A[largest]:=temp;
      i:=largest;
    end;
    until largest = save;
    (*Why i used repeat until istead of while ?
     because body of the called procedure will be executed 
     at least once *)
end;

还有一件事,在Wirth的算法+数据结构=程序中 可以找到没有递归的筛选程序 但我们应该引入布尔变量或break来消除goto语句

以上是关于如何在没有递归的情况下编写Max Heap代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在考虑每个用户的屏幕分辨率的情况下编写代码? [复制]

如何在没有转义序列的情况下停止递归

QRegexp 特质(与 perl 相比):如何在没有惰性量词的情况下编写此正则表达式?

在 Mathematica 中迭代生成谢尔宾斯基三角形?

如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?

如何在linux/ubuntu下编写c++网络通信代码