概要
ジョークとして知られるスターリンソートをより実用的(?)にしてみた。
開発環境
とりあえずPythonで実装
実装
通常のスターリンソートは、あらかじめ並んだ配列から順序通りにならない要素を消すことで、数値上ソートされたような配列を得る
一度消された要素に対しても「ソート」を適応するとどうなるだろうか
まず、気に入らない同志(要素)を粛清するのではなくシベリア送りにする
import random
Сибирь = []
Товарищ = []
#同志を集める
for i in range(100):
Товарищ.append(random.randint(1, 100))
print(Товарищ)
# > [5, 2, 4, 1, 3 ...]
j = 1
for i in range(1, len(Товарищ)):
if Товарищ[j] < Товарищ[j-1]:
#宣言
print("ссылка в Сибирь:"+str(i))
#シベリア送りに
Сибирь.append(Товарищ.pop(j))
else:
j += 1
print(Товарищ)
# > Товарищ = [5, ...]
# > Сибирь = [2, 4, 1, 3 ...]
シベリア送りにした同志は、必ず生き残った同志より前に配置される必要性が高い…ため、「配列Товарищの前方に配列Сибирьを結合した後に、再びシベリア送りの判定をする」ということを繰り返していけば、徐々に配列の前方に小さい数値が集まり、結果として完全なソートが完了する
1回目後の帰還
↓ ↓ ↓ ↓
Товарищ = [2, 4, 1, 3, 5, ...]
判定2回目
# Товарищ = [2, 4, 5, ...]
# Сибирь = [1, 3, ...]
# (Товарищ = [1, 3, 2, 4, 5, ...])
判定3回目
# Товарищ = [1, 3, 4, 5, ...]
# Сибирь = [2, ...]
# (Товарищ = [2, 1, 3, 4, 5, ...])
判定4回目
# Товарищ = [2, 3, 4, 5, ...]
# Сибирь = [1, ...]
# (Товарищ = [1, 2, 3, 4, 5 ...])
判定5回目
# Товарищ = [1, 2, 3, 4, 5, ...]
# Сибирь = []
# →順序を乱す要素が存在しないためこれ以上判定を繰り返す必要はない
→ソート終わり!
名付けてスーパー・スターリンソート
計算効率?何を言っているんだねひたすら繰り返すだけだ
プログラムを実行
※ログがめちゃくちゃ長いので、必要に応じてシベリア送り宣言をしてるprintをコメントアウトするか、Google colabとかに移して眺めてみてください