続いて、データ数を変更して、整列にかかる時間がどのくらい変化するか確認してみましょう。
以下のプログラムを実行しましょう。
import random
import time
# リストをランダムに生成する関数
def generate_array(size, low, high):
return random.sample(range(low, high+1), size) # 重複なし
# ===== メイン処理 =====
data = generate_array(1000, 1, 100000) # リストを作成
print("整列前の配列:", data)
start = time.time()
n = len(data) - 1 #データ数
while n > 0:
i = 0
while n > i:
if data[i] > data[i+1]:
w = data[i]
data[i] = data[i+1]
data[i+1] = w
i += 1
n -= 1
end = time.time()
print("ソート後の配列:", data)
print("処理時間: {:.6f} 秒".format(end - start))
1行目・2行目
import random
import time
ランダムでデータを生成するrandomモジュールと、時間を計測するtimeモジュールをインポートします。
5行目・6行目
def generate_array(size, low, high):
return random.sample(range(low, high+1), size) # 重複なし
ランダムな値でリストを生成します。
(見本)generate_array(10,1,100)
第1引数:生成するデータの個数(見本ではリストを10個生成する)
第2引数:生成するデータの範囲の最小値(見本では最小値は1になる)
第3引数:生成するデータの範囲の最大値(見本では最大値は100になる)
第2引数が20、第3引数が100なら、20〜100の間の値のみでデータを生成します。
9行目・10行目
data = generate_array(1000, 1, 100000) # リストを作成
print("整列前の配列:", data)
generate_array()関数を呼び出し、1,000件のデータを1~100,000の間でランダムな値でリストを作成します。
第1引数が1000なので、1000件のデータを生成します。
その後、生成したデータを表示します。
12行目
start = time.time()
現在の時刻を取得します。
0.000001秒(1マイクロ秒)という細かい単位での時間になります。
14行目〜23行目
n = len(data) - 1 #データ数
while n > 0:
i = 0
while n > i:
if data[i] > data[i+1]:
w = data[i]
data[i] = data[i+1]
data[i+1] = w
i += 1
n -= 1
交換法で整列します。
27行目・28行目
print("ソート後の配列:", data)
print("処理時間: {:.6f} 秒".format(end - start))
整列後の配列と、整列で経過した時間を表示します。
整列後に取得した時刻と、整列前に取得した時刻の差を求めることで、経過時間を求めます。
0.1秒ちょっとで完了するって、とっても速いんだね!
そうですね。ランダムでデータが生成されるので、交換回数の差から多少の変化は出ますが、だいたい同じくらいの時間になります。
それでは、続いてデータ数を10,000件に増やしてみましょう。
9行目を以下の内容で書き換えてください。
data = generate_array(10000, 1, 100000)
1,000を10,000に変更して、実行してみましょう。
少し時間がかかって心配になるかもしれませんが、少し待ってみてください。
30秒もかからないと思います。
プログラムを修正したら実行して、結果が出るのを待ちましょう。
データ数は10倍だったけど、処理時間は100倍くらいになったね。
データ数は10倍なのに対し、処理時間が100倍近くになった理由を考え、説明してください。
ヒント
データに対する、比較回数の計算式は、以下の通りです。
比較回数 = n × ( n - 1 ) ÷ 2
nが1000の時と、10000の時で、それぞれ比較回数を求めてみましょう。