「heapSort」をトレース
このプログラムは「本プログラム heapSort」から、副プログラム「makeHeap」と「downHeap」を順に呼び出して、数列を昇順(小さい順)に整列させます。
3行目の「makeHeap」が終わった時点で、各関数の数値は以下のようになっています。
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
60 | 30 | 45 | 15 | 5 | 10 | 20 |
hnum = 7
4行目からトレースします。
・last:hnum-1, last > 0, -1
last の初期値を hnum-1 として、繰り返すごとに -1 しながら、 0 より大きい間ループします。
last |
---|
6 |
・swap(heap, 0, last)
最大の数値であることが確定しているheap[0]を数列のお尻に移動します。
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
30 | 45 | 15 | 5 | 10 |
空欄cはエです。
downHeapをトレースする
「makeHeap」の6行目を見ると「downHeap」に「heap」と「last-1」を入れています。
「downHeap」の1行目で「heap[]」と「hlast」として受けていますので、hlast の初期値は 5 になります。
n | tmp | hlast |
---|---|---|
5 |
・n ← 0
n | tmp | hlast |
---|---|---|
0 | 5 |
・lchild(n) <= hlast
左の子が整列対象領域内のあいだ、5行目から15行目の処理をループします。
・tmp ← lchild(n)
n | tmp | hlast |
---|---|---|
0 | 1 | 5 |
・rchild(n) <= hlast
右側の子が整列対象領域内で、
・heap[tmp] <= heap[rchild(n)]
右側の子が左側の子以上だった場合、
・tmp ← rchild(n)
を実行します。
n | tmp | hlast |
---|---|---|
0 | 5 |
空欄dはイです。
・heap[tmp] > heap[n]
最大の子と親を比べ、子のほうが大きいときは上の処理をします。
・swap(heap, n, tmp)
親と子を交換します。
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
30 | 15 | 5 | 10 |
・n ← tmp
n | tmp | hlast |
---|---|---|
5 |
空欄eはイです。
「downHeap」のループ2回目
設問は以上で終わりですが、以下にその後の処理を記します。
・lchild(n) <= hlast
左の子が整列対象領域内なので5行目以降の処理をします。
・tmp ← lchild(n)
n | tmp | hlast |
---|---|---|
5 |
・rchild(n) <= hlast
右側の子が整列対象領域内ではないので内側の処理はしません。
・heap[tmp] <= heap[rchild(n)]
左側の子が親以上ではないので、下の処理をします。
「downHeap」を抜けます。
「heapSort」のループ2回目
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
30 | 15 | 5 |
last |
---|
2回目の「downHeap」
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
15 | 5 |
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
5 |
「heapSort」のループ3回目
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
last |
---|
3回目の「downHeap」
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
「heapSort」のループ4回目
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
last |
---|
4回目の「downHeap」
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
「heapSort」のループ5回目
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
last |
---|
5回目の「downHeap」
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
「heapSort」のループ6回目
heap[]
[0] | [1] | [2] | [3] | [4] | [5] | [6] |
---|---|---|---|---|---|---|
|
last |
---|
6回目の「downHeap」
変化なし
以上です。
heap[0]から[6]まで、小さい順に並べなおすことができました。
ホームに戻るボタン↓