Week 8 (2025/6/6)¶
今週の目的
分割統治法を用いてデータを昇順・降順に並べ替える。
今週のキーワード
- ヒープを用いたヒープソート
- 分割統治法を用いたマージソートとクイックソート
今回はソートアルゴリズムとしてヒープソートと、マージソート、クイックソートを実装する。
課題1:ヒープでデータを並べ替える¶
前回に作成したDB
クラス(親クラス)を継承したDBwHeapSort
クラス(子クラス)を定義し、sort
メソッドを「ヒープソートアルゴリズム」で実装せよ。なお、DB
クラスはdef_db.py
モジュールのDB
クラスをインポートして用いること。
今回作成するDBwHeapSort
クラスの仕様は、以下の通りである。
DBwHeapSortクラス
class DBwHeapSort()
DB
クラスのサブクラス
格納したデータをヒープソートで並べ替えるクラス
インスタンス変数
- heap: ヒープソートで用いるヒープ
- queue: ヒープソートで用いるキュー
sort()
リストの中身をヒープソートで昇順に並べ替えるメソッド
なお、ヒープソートの実装には、def_heap.py
モジュールのHeap
クラスとそのメソッドを用いる。Heap
クラスの各メソッドの仕様はWeek8を参照すること。
まず、build_heap
メソッドを用いて、DBwHeapSort
インスタンス内のリストからヒープを構成し、その後、delete_min
メソッドを繰り返して、値の小さいものから順にヒープから取り出す。取り出したデータはキュー(def_queue_stack.py
モジュールを用いてよい)にenqueue
し、全てのデータをenqueue
した後に、dequeue
でデータを取り出しDBwHeapSort
インスタンス内のリストに再格納する。
最後に、実装したDBwHeapSort
クラスのインスタンスを用いて、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)です。
ソートが完了しました!DBwHeapSortは0.03531908988952637秒かかりました。
課題2:データを並べ替える(マージソート)¶
課題1に作成したDB
クラス(親クラス)を継承し、DBwMergeSort
クラス(子クラス)を定義して、sort
メソッドを「マージソートアルゴリズム」で実装せよ。
今回作成するDBwMergeSort
クラスの仕様は、以下の通りである。
DBwMergeSortクラス
class DBwMergeSort()
DB
クラスのサブクラス
格納したデータをマージソートで並べ替えるクラス
sort()
リストの中身をマージソートで昇順に並べ替えるメソッド
最後に、実装したクラスのインスタンスを用いて、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)です。
ソートが完了しました!DBwMergeSortは0.013421058654785156秒かかりました。
課題3:データを並べ替える(クイックソート)¶
課題1で作成したDB
クラス(親クラス)を継承し、DBwQuickSort
クラス(子クラス)を定義して、sort
メソッドを「クイックソートアルゴリズム」で実装せよ。
今回作成するDBwQuickSort
クラスの仕様は、以下の通りである。
DBwQuickSortクラス
class DBwQuickSort()
DB
クラスのサブクラス
格納したデータをクイックソートで並べ替えるクラス
sort()
リストの中身をクイックソートで昇順に並べ替えるメソッド
最後に、実装したクラスのインスタンスを用いて、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)です。
ソートが完了しました!DBwQuickSortは0.008417844772338867秒かかりました。
発展課題4:データの並べ替え時間を比較する¶
これまで実装したDBwBubbleSort
クラス、DBwSelectSort
クラス、DBwInsertSort
クラス、DBwHeapSort
クラス、DBwMergeSort
クラス、DBwQuickSort
クラスの各インスタンスを用いて、allkyotobus_stop.dat
のデータをバス停の経度の小さい順(西から東に)に並べ替えて、その実行時間を表示せよ。本課題は、実装が異なると実行速度が変わることを理解することが目的である。
ソートが完了しました!DBwBubbleSortは0.6107010841369629秒かかりました。
ソートが完了しました!DBwSelectSortは0.3105299472808838秒かかりました。
ソートが完了しました!DBwInsertSortは0.1937861442565918秒かかりました。
ソートが完了しました!DBwHeapSortは0.024415016174316406秒かかりました。
ソートが完了しました!DBwMergeSortは0.009604930877685547秒かかりました。
ソートが完了しました!DBwQuickSortは0.009488821029663086秒かかりました。