Week 6 (2025/5/23)¶
今週の目的
データを昇順・降順に並べ替える。
今週のキーワード
- 二重ループ
- 値の入れ換え(スワップ)
- バブルソート、選択法、挿入法
今回はアルゴリズムの実装として、データ列を並べ替える(ソート)プログラムを実装する。
具体的には、隣同士を比較して入れ替えていくバブルソート、最小値もしくは最大値を見つけて左端と入れ替える選択法、整列済みのデータ列にデータを挿入していく挿入法を実装する。
課題1:データを並べ替える(バブルソート)¶
データをリストに格納するadd
メソッドと、そのリストを表示するdisplay
メソッド、リストの件数を返すcount
メソッド、データを昇順に並べ替えるsort
メソッド、データが昇順にソートされているか確認するis_sorted
メソッドを備えたDB
クラス(親クラス)を定義せよ。
DB
クラスの仕様は、以下の通りである。
DBクラス
class DB()
格納したデータを並べ替えるクラス
インスタンス変数
- list: データ格納用のリスト
add(data)
データをリストに格納するメソッド
パラメータ
- data: 格納するデータ(
Stop
インスタンス)
display()
リストの中身を表示するメソッド
count()
リストの件数を数えるメソッド
返り値
- リストに格納されていたデータの件数を返す(整数)
sort()
リストの中身を昇順に並べ替えるメソッド
is_sorted()
リストの中身が昇順に並んでいるか確認するメソッド
返り値
- データが昇順に並んでいれば
True
、そうでなければFalse
を返す(ブール値)
その後、DB
クラスを継承したDBwBubbleSort
クラス(子クラス)を定義し、sort
メソッドを「バブルソートアルゴリズム」で実装せよ。
DBwBubbleSort
クラスの仕様は、以下の通りである。
DBwBubbleSortクラス
class DBwBubbleSort()
DB
クラスのサブクラス
格納したデータをバブルソートで並べ替えるクラス
sort()
リストの中身をバブルソートで昇順に並べ替えるメソッド
最後に、実装したDBwBubbleSort
クラスのインスタンスを用いて、allkyotobus_stop.dat
のデータをバス停の経度の小さい順(西から東に)に並べ替えて、その結果と実行時間を表示せよ。
1: 下夜久野駅前(ID:ED01_85)のバス停の緯度経度は(35.32033486,134.99883496)です。
2: 畑口(ID:ED01_86)のバス停の緯度経度は(35.32009052,135.00174923)です。
(中略)
1849: 自治会館前(ID:ED01_2850)のバス停の緯度経度は(34.86017838,135.89218112)です。
1850: 緑苑坂東(ID:ED01_2851)のバス停の緯度経度は(34.86244101,135.89352647)です。
ソートが完了しました!DBwBubbleSortは1.0563509464263916秒かかりました。
if __name__ == '__main__':とは?
プログラムで定義されたクラス(たとえばDB
クラス)や関数を他のプログラムにインポートすると、インポートしたクラスや関数だけでなく、そのプログラム全体が読み込まれ実行されます。
クラス定義や関数定義のみ書かれたプログラムであれば問題ありませんが、それらを使った処理まで書かれていると、それらが実行されてしまいます。たとえば、week7_1.py
のDB
クラスのみをインポート(from week7_1 import DB
)して、DB
クラスを継承したDBwSelectSort
クラスを実装しようとすると、DBwBubbleSort
インスタンスを生成して、データを追加しソートして結果を表示する処理も実行されるわけです。
プログラムをモジュールとしてインポートしている(from week7_1 import DB
)のか、プログラムを直接実行している(python week7_1.py
)のかを区別するために__name__
という特殊なグローバル変数があります。__name__
の値がモジュール名の場合(week7_1
)は、インポートしているときの実行を表し、__name__
の値が'main'
の場合は、プログラムを直接実行していることを表しています。
したがって、if __name__ == '__main__':
と書くと、そのプログラムがモジュールとして他のプログラムにインポートされたときに、if __name__ == '__main__':
以下の処理をスキップすることができます。
課題2:データを並べ替える(選択ソート)¶
課題1で作成したDBクラス(親クラス)を継承したDBwSelectSort
クラス(子クラス)を定義し、sort
メソッドを「選択ソートアルゴリズム」で実装せよ。
DBwSelectSort
クラスの仕様は、以下の通りである。
DBwSelectSortクラス
class DBwSelectSort()
DB
クラスのサブクラス
格納したデータを選択ソートで並べ替えるクラス
sort()
リストの中身を選択ソートで昇順に並べ替えるメソッド
最後に、実装したDBwSelectSort
クラスのインスタンスを用いて、allkyotobus_stop.dat
のデータをバス停の経度の小さい順(西から東に)に並べ替えて、その結果と実行時間を表示せよ。
1: 下夜久野駅前(ID:ED01_85)のバス停の緯度経度は(35.32033486,134.99883496)です。
2: 畑口(ID:ED01_86)のバス停の緯度経度は(35.32009052,135.00174923)です。
(中略)
1849: 自治会館前(ID:ED01_2850)のバス停の緯度経度は(34.86017838,135.89218112)です。
1850: 緑苑坂東(ID:ED01_2851)のバス停の緯度経度は(34.86244101,135.89352647)です。
ソートが完了しました!DBwSelectSortは0.7865409851074219秒かかりました。
課題3:データを並べ替える(挿入ソート)¶
課題1で作成したDB
クラス(親クラス)を継承したDBwInsertSort
クラス(子クラス)を定義し、sort
メソッドを挿入ソートアルゴリズムで実装せよ。
DBwInsertSort
クラスの仕様は、以下の通りである。
DBwInsertSortクラス
class DBwInsertSort()
DB
クラスのサブクラス
格納したデータを挿入ソートで並べ替えるクラス
sort()
リストの中身を挿入ソートで昇順に並べ替えるメソッド
最後に、これまで実装したDBwBubbleSort
クラス、DBwSelectSort
クラス、DBwInsertSort
クラスの各インスタンスを用いて、allkyotobus_stop.dat
のデータをバス停の経度の小さい順(西から東に)に並べ替えて、その実行時間を表示せよ。本課題は、実装が異なると実行速度が変わることを理解することが目的である。