問題 #21 ・ 整列・探索 ・ 難易度 3
次のプログラムは、整数型の配列 data を選択ソートで昇順に整列し、その過程で比較回数 compCount と交換回数 swapCount を数える。配列 data の初期値が {5, 3, 8, 1, 4} であるとき、プログラムの実行が終了した時点での compCount と swapCount の値の組合せとして正しいものはどれか。ここで、配列の要素番号は 1 から始まる。
○手続 selectionSort(整数型の配列: data)整数型: n ← dataの要素数整数型: compCount ← 0整数型: swapCount ← 0整数型: i, j, minIdx, tmpfor (i を 1 から n - 1 まで 1 ずつ増やす)minIdx ← ifor (j を i + 1 から n まで 1 ずつ増やす)compCount ← compCount + 1if (data[j] < data[minIdx])minIdx ← jendifendforif (minIdx ≠ i)swapCount ← swapCount + 1tmp ← data[i]data[i] ← data[minIdx]data[minIdx] ← tmpendifendfor
選択ソートは、未整列部分から最小値を見つけて先頭と交換する処理を繰り返す。配列 data = {5, 3, 8, 1, 4}(要素数 n = 5)について各パスをトレースする。 【i = 1】minIdx = 1(値 5) j=2: 3 < 5 → minIdx=2、j=3: 8 < 3? No、j=4: 1 < 3 → minIdx=4、j=5: 4 < 1? No 比較 4 回(compCount=4)。minIdx=4 ≠ 1 → 交換(swapCount=1)。data = {1, 3, 8, 5, 4} 【i = 2】minIdx = 2(値 3) j=3: 8 < 3? No、j=4: 5 < 3? No、j=5: 4 < 3? No 比較 3 回(compCount=7)。minIdx=2 = 2 → 交換なし(swapCount=1)。data = {1, 3, 8, 5, 4} 【i = 3】minIdx = 3(値 8) j=4: 5 < 8 → minIdx=4、j=5: 4 < 5 → minIdx=5 比較 2 回(compCount=9)。minIdx=5 ≠ 3 → 交換(swapCount=2)。data = {1, 3, 4, 5, 8} 【i = 4】minIdx = 4(値 5) j=5: 8 < 5? No 比較 1 回(compCount=10)。minIdx=4 = 4 → 交換なし(swapCount=2)。data = {1, 3, 4, 5, 8} 最終結果: compCount = 10、swapCount = 2。よって正解はイである。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。