LoginSignup
1
1

More than 3 years have passed since last update.

Bubble sortがO(n^2)を体感した話。

Last updated at Posted at 2019-08-15

やったこと

bubble sortをpythonで実装して、ソートするリストの長さを変え、実行時間がリストの長さの2乗に比例することを理解した。

実装

https://qiita.com/shinshin86/items/40122455dee2bfd2f3f1
を参考にして、ランダムな配列の作り方を実装しました。

長さeのランダムな並びのリストを作って、それぞれに対して、実行時間を測っています。

bubble_sort.py
def bubble_sort(a):
    # input array and return sorted array
    for i in range(1,len(a)):
        j = i # j is current pos
        while j != 0 and a[j] < a[j-1]:
            a[j],a[j-1] = a[j-1],a[j]
            j -= 1
    return a 


e=[10,100,1000,10000,100000] # 要素数
size = 1000000 # 0~sizeまで
if __name__=="__main__":
    import random
    import time
    for k in e:
        init_list = random. sample(list(range(0, size)), k)
        #print(init_list)

        start = time.time()
        bubble_sort(init_list)
        end = time.time()

        #print(init_list)
        print("bubble_sort : size {} time {}".format(k,end-start))

 結果

bubble_sort : size 10 time 1.9311904907226562e-05
bubble_sort : size 100 time 0.0008120536804199219
bubble_sort : size 1000 time 0.07604408264160156
bubble_sort : size 10000 time 7.907392978668213

sizeが10の時に小さいのは、ソート以外での処理にかかる時間(関数の呼び出しなど?)と思えば、リスト長が大きくなると、size100から1000,1000から10000をみると、長さが10倍になると、実行時間が100倍になっていることがわかります。

 余談(逆順にソートされている場合)

reverse_list.py
def bubble_sort(a):
    # input array and return sorted array
    for i in range(1,len(a)):
        j = i # j is current pos
        while j != 0 and a[j] < a[j-1]:
            a[j],a[j-1] = a[j-1],a[j]
            j -= 1
    return a 


e=[10,100,1000,10000,100000] # 要素数
size = 1000000 # 0~sizeまで
if __name__=="__main__":
    import random
    import time
    for k in e:
        #init_list = list(range(k,0,-1))
        init_list = random. sample(list(range(0, size)), k)
        if k < 100:
            print(init_list)
        pass
        start = time.time()
        bubble_sort(init_list)
        end = time.time()

        #print(init_list)
        print("bubble_sort : size {} time {}".format(k,end-start))

ちなみに逆順になっている場合は、理論的には、単純に、一番外のループ(今回のコードでいうところでのi)で、終了するまでにswapを繰り返す回数(jを何回更新するか)が、ランダムな時は、i/2で理論的になるのが、逆順になっている場合は、全部入れ替える必要があるので、i回swapが必要となり、ループを回る回数(実行時間も)は2倍になるはずです。(あってますよね?)

そこで実行してみると、以下のようになり、確かに、ランダムな場合の2倍かかっていることが確認できました。
面白いですね。

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
bubble_sort : size 10 time 1.5020370483398438e-05
bubble_sort : size 100 time 0.001268148422241211
bubble_sort : size 1000 time 0.15845394134521484
bubble_sort : size 10000 time 14.583886861801147
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1