Smalltalkの練習がてら、かなり賞味期限が切れたネタですがスターリンソートを実装してみました。
Advent Calendarの期限は過ぎていますが、賑やかしにスターリンの誕生日である12月18日のSmalltalk Advent Calendarに載せてみます。
実装内容
immutableなArrayの場合は自身を変えられないのでstalinSort
ではなくstalinSorted
というメソッド名にしています。
SequencableCollection.st
stalinSorted
^ self copy stalinSorted: [ :a :b | a <= b ]
SequencableCollection.st
stalinSorted: aBlock
| result |
result := self copyFrom: 1 to: 1.
(self copyFrom: 2 to: self size) doWithIndex: [ :each :index |
(aBlock value: result last value: each)
ifTrue: [ result := result copyWith: each ]
ifFalse: [ ]
].
^ result
いまだにSmalltalk的な書き方がよくわかりません……。
実行結果
#(6 2 5 7 3 8 8 4) stalinSorted. "#(6 7 8 8)"
#(1 2 1 3 2 3 4) stalinSorted. "#(1 2 3 3 4)"
一応期待通り(?)粛清できているようです。