アプリ版:「スタンプのみでお礼する」機能のリリースについて

ヒープソートについての問題です。

下のプログラムはヒープソートに格納するためのプログラムです。
この時、一つの数字を格納するたびにその時点で全体がどんな配列になっているかを表示するためには、どのように書いたらいいでしょうか?

教えてください。
よろしくお願いいたします。


void PushHeap(int x){
int i;
int oya; //親の配列

if(++n>=11){
printf("Heap Overflow\n");
exit(1);
}
else{
heap[n]=x; //数値を代入
printf(" heap[%d] 格納された数=%d\n",n,heap[n]);

i=n;
oya=i/2;
while(oya>0 && x>heap[oya]){ //親より数値が大きい
heap[i]=heap[oya]; //入れ替え
i=oya;
oya=i/2;

}
heap[i]=kazu;

if(i/2==0){
printf("親:%d\n\n",heap[i]);
}
else printf("親:%d, 子:%d\n\n",heap[i/2],heap[i]);
}
}

A 回答 (1件)

こんな感じで如何でしょう?



表示例:
6 4 5 1 3 2 0 0 0 0
root:6
 left:4
  left:1
   left:Null
   right:Null
  right:3
   left:Null
   right:Null
 right:5
  left:2
   left:Null
   right:Null
  right:Null



※1 未使用のheap[i]には0が入っていると仮定しています。
-------------------------
void PrintSPC(int n){
const char s[] = " "; // ここは半角スペース20個入れて下さい。
char *p;
int i = 2*n;

p = (char*)s;
while(*p!='\0') p++;
p -= i;
printf("%s", p);
}

char *name[3] = {"root", "left", "right"};

void PrintHeap(int idx, int indent, int kind){
if(idx >= 11 || heap[idx] == 0){ // ※1
PrintSPC(indent);
printf("%s:Null\n", name[kind]);
return;
}
PrintSPC(indent);
printf("%s:%d\n",name[kind], heap[idx]);
PrintHeap(idx*2, indent+1, 1);
PrintHeap(idx*2+1, indent+1, 2);
}


int main(void) {
int i;

PushHeap(1);
PushHeap(2);
PushHeap(3);
PushHeap(4);
PushHeap(5);
PushHeap(6);

for(i = 1; i < 11; i++) printf("%d ", heap[i]);
printf("\n");

PrintHeap(1,0,0);

return 0;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!