ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

Flourishを使ってソートアルゴリズムを可視化(バブルソート、選択ソート、挿入ソート)

こんにちは、ぱそきいろです。
年末にFlourishを使ってコロナの都道府県ごとの感染状況を可視化しました。
www.takacpu55.xyz
他にも可視化して遊びたかったのですが、ちょうどいいデータが落ちていなかったので、ソートアルゴリズムを可視化します。
とりあえず扱いやすそうな、バブルソート、選択ソート、挿入ソートを可視化します。
他のソートは後日またアップします。

出来たもの

再生リストを作ったので置いておきます。
www.youtube.com

バブルソート、選択ソート、挿入ソートの要素数10,100のパターンを動画にしております。
(youtubeに動画を挙げるのは割と大変だったけど、その話はまた今度)

コード

ソートのコードはここら辺を参考にさせていただきました。
qiita.com
qiita.com
変えたところはソートの経緯を吐き出すようにしています。
吐き出されたCSVファイルはFlourishで可視化しやすい形になっています。

import random
import pandas as pd

def bSort(a):#バブルソート
    temp=0
    df=pd.DataFrame()
    df[temp]=""
    temp+=1

    for i in range(len(a)):
        for j in range(len(a)-1, i, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
                df[temp]=a
                temp+=1

    return df

def sSort(a):#選択ソート
    temp=0
    df=pd.DataFrame()
    df[temp]=""
    temp+=1
    for i in range(len(a)-1):
        mi = a[i:].index(min(a[i:]))
        a[i], a[i+mi] = a[i+mi], a[i]
        print(a)
        df[temp]=a
        temp+=1
    df[temp]=a

    return df

def iSort(a):#挿入ソート
    temp=0
    df=pd.DataFrame()
    df[temp]=""
    temp+=1
    for i in range(1, len(a)):
        for j in range(i, 0, -1):
            if a[j] >= a[j-1]:
                break
            else:
                a[j], a[j-1] = a[j-1], a[j]
                df[temp]=a
                temp+=1

    df[temp]=a

    return df

def arrayGen(a):

    retlist=list(range(1,a+1))
    random.shuffle(retlist)
    return retlist

if __name__ == '__main__':
    n=arrayGen(10)
    barray=bSort(n)
    barray.to_csv("./data/bubble10.csv",index=False)

    n=arrayGen(10)
    sarray=sSort(n)
    sarray.to_csv("./data/selection10.csv",index=False)

    n=arrayGen(10)
    iarray=iSort(n)
    iarray.to_csv("./data/insertion10.csv",index=False)

CSVファイルをFlourishにアップしたら動画になります。
(設定は適宜見やすいものに変えてください)
app.flourish.studio

まとめ

Flourishを使って遊びたかったけど、なかなかいいデータが見当たらなかったので自分でソートの履歴を作って可視化しました。
何か面白いデータが落ちてたら教えて欲しいです。
以上、ありがとうございました。