Pythonで選択法のプログラムを作成しよう

学習の目的

  • 1. 選択法のアルゴリズム

  • 2. Pythonプログラムを完成させよう

1. 選択法のアルゴリズム

選択法のアルゴリズムは、交換法(バブルソート)に似ています。

選択法のフローチャートは次の通りです。

選択法のフローチャート

バブルソートのフローチャートとそっくりですね。

どこが違っているんだろう?

実は交換する条件が違うだけなんですよ。

わっ!本当だ。交換する条件が少しだけ違っている。

ほんの少しの違いで、バブルソートとは異なるアルゴリズムなのですね。

不思議な感じです。

そうですね。少し違うと手順が変わったり効率が変わったりします。

それでは、選択法のアルゴリズムをPythonで作成してみましょう。

2. Pythonプログラムを完成させよう

今回のプログラムは、並び替えるだけではなく「比較回数」、「交換回数」、「並び替え処理にかかる時間」の3つを計測しています。詳しくは参考を見てください。

参 考
項目 変数名 説明
比較回数のカウント compare_count 比較回数をカウントする。
20行目:compare_count = 0  # カウント用に0で初期化する
30行目:compare_count = compare_count + 1  # 比較回数を1カウントアップする
42行目:print("比較回数:", compare_count)  # 比較回数を表示する
交換回数のカウント swap_count 交換回数をカウントする。
21行目:swap_count = 0  # カウント用に0で初期化する
35行目:swap_count = swap_count + 1  #交換回数を1カウントアップする
44行目:print("交換回数:", swap_count)  #交換回数を表示する
整列処理時間の計測 start_time
end_time
選択法で並び替えを行う処理を計測する。
25行目:start_time = time.time()  # 整列処理開始時刻の取得
38行目:end_time = time.time()  # 整列処理終了時刻の取得
44行目:print("処理時間: {:.6f} 秒".format(end_time - start_time))  # 終了時刻 - 開始時刻を計算し、処理時間を求めて表示する

表にある「比較回数のカウント」・「交換回数のカウント」・「整列処理時間の計測」に関する命令は、整列アルゴリズムとは直接関係なく、整列処理の効率を測るためのデータを表示するための記述です。

次のPythonプログラムは選択法でデータを並び替えるプログラムです。プログラムは下記からGooge Colabを開き確かめましょう。

Google Colabは次のリンクから開きましょう。

また、新しくノートブック「ip0211」を作成してプログラムを貼り付けて実行してください。

import random
import time

# 配列をランダムに生成する関数(探索で利用したもの)
def generate_array(size=10, low=1, high=100):
    """
    ランダムな整数の配列を生成する
    size : 要素数
    low  : 最小値
    high : 最大値
    """
    return random.sample(range(low, high+1), size)  # 重複なし

# ここから処理を始める
# ランダム配列を生成
data = generate_array(20, 1, 100000) # 配列の作成
print("ソート前:", data)

# 初期化
compare_count = 0 # 比較回数カウント用
swap_count = 0 # 交換回数カウント用
n = len(data) #配列の要素数を n に代入

# 時間計測用 ソート開始時間の取得
start_time = time.time()

#選択法の開始
for i in range(n - 1):
    for j in range(i + 1, n):
        compare_count = compare_count + 1 #比較回数のカウントアップ
        if (a) # データを交換する条件
            (b-1) # データを交換する
            (b-2) # データを交換する
            (b-3) # データを交換する
            swap_count = swap_count + 1 # 交換回数のカウントアップ

# ソート終了時間
end_time = time.time()

# 表示
print("ソート後:", data)
print("比較回数:", compare_count)
print("交換回数:", swap_count)
print("処理時間: {:.6f} 秒".format(end_time - start_time))

課題1

データが正しく昇順に並び替えられるように空欄(a)、(b-1)、(b-2)、(b-3)を埋めて完成させましょう。解答は下記の候補から選んで実行してください。

空欄(a)は交換する条件式が入ります。(b-1),(b-2),(b-3)は交換処理です。フローチャートをよく見てプログラムを完成させましょう。

下記から正しい命令を選んでください。

data[i] == data[j] :
data[i] < data[j] :
data[i] > data[j] :
data[i] = data[j]
data[j] = data[i]
temp = data[i]
temp = data[j]
data[i] = temp
data[j] = temp

プログラムの空欄(a)、(b-1)、(b-2),(b-3)に入る命令を答えてください。

(a)に入る命令を答えてください

(b-1)に入る命令を答えてください

(b-2)に入る命令を答えてください

(b-3)に入る命令を答えてください

課題2

プログラムの交換条件の1行を変えることで、並び順を「降順(大きい順)」に変えることができます。変更する行番号と変更内容を答えてください。入る命令は、課題1の命令一覧から選んでください。

昇順から降順に並び順を変えるということは、交換する条件が変わるということです。

変更する行数を答えてください。

変更後の命令を答えてください。

※この再現版では提出は行いません(送信先は未接続です)

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる