kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

GRL_4_B: Topological Sort (続き3)

本来大小決められないあたりを適当に大小つけてるので
そのあたりにあやしいゾーンができてそうだってこと

調べる
成功するパターンから

コード

def sort(V):
    print([v.id for v in V])
    for i in range(len(V)):
        for j in reversed(range(i, len(V) - 1)):
            if V[j] > V[j+1]:
                swap(V, j, j + 1)
        print([v.id for v in V])

結果

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
[9, 5, 0, 1, 2, 3, 4, 8, 6, 7]
[9, 5, 7, 0, 1, 2, 3, 4, 8, 6]
[9, 5, 7, 2, 0, 1, 6, 3, 4, 8]
[9, 5, 7, 2, 4, 0, 1, 6, 3, 8]
[9, 5, 7, 2, 4, 8, 0, 1, 6, 3]
[9, 5, 7, 2, 4, 8, 3, 0, 1, 6]
[9, 5, 7, 2, 4, 8, 3, 6, 0, 1]
[9, 5, 7, 2, 4, 8, 3, 6, 0, 1]
[9, 5, 7, 2, 4, 8, 3, 6, 0, 1]

if文をこう書き換えると

            if V[j+1] < V[j]:

こう

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 0, 1, 4, 3, 5, 9, 6, 7, 8]
[2, 4, 0, 1, 3, 5, 9, 7, 6, 8]
[2, 4, 0, 3, 1, 5, 9, 7, 6, 8]
[2, 4, 0, 3, 5, 1, 9, 7, 6, 8]
[2, 4, 0, 3, 5, 9, 1, 7, 6, 8]
[2, 4, 0, 3, 5, 9, 7, 1, 6, 8]
[2, 4, 0, 3, 5, 9, 7, 6, 1, 8]
[2, 4, 0, 3, 5, 9, 7, 6, 8, 1]
[2, 4, 0, 3, 5, 9, 7, 6, 8, 1]
[2, 4, 0, 3, 5, 9, 7, 6, 8, 1]

もっとこまかくprintする
最初のステップ

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
   [0, 1, 2, 3, 4, 5, 6, 7, 9, 8]
   [0, 1, 2, 3, 4, 5, 6, 9, 7, 8]
   [0, 1, 2, 3, 4, 5, 9, 6, 7, 8]
   [0, 1, 2, 4, 3, 5, 9, 6, 7, 8]
   [0, 2, 1, 4, 3, 5, 9, 6, 7, 8]
   [2, 0, 1, 4, 3, 5, 9, 6, 7, 8]
[2, 0, 1, 4, 3, 5, 9, 6, 7, 8]

これは合ってるの?

9は8や7や6よりは小さくて5とは大小決まらない
5と4は大小決まらない
4は3より小さくて2とは大小決まらない
2は1や0より小さい
書いたとおりだ(当然

でもバブルソートだから一番小さいものが一発で一番左にこないと変だよな
どれが一番小さいかは決められないけど
すくなくとも2が一番小さいということはない

            if V[j] > V[j+1]:

ではうまくいっている(ように見える)のに

            if V[j+1] < V[j]:

だとうまくいかないというのはなにか具体的な理由がある?

大小決まらないグレーゾーンの入り方が違うか
<(__lt__)はグレーゾーンがFalseになるけど
>(__gt__)はグレーゾーンがTrueになる
だから>のほうがswapされやすいってわけか

>なら100%OKとまではまだ言えてないと思うけど
先へ進んでもいいってくらいには納得した
ただ、バブルソートじゃなくなった途端うまくいかなくなるって
可能性は多大にある
組み込みのソートじゃだめだったし

バブルソートで間に合ってくれることを祈って進む