バブルソート

Arrayのインスタンスメソッドとしてbubble_sortを実装してみました。範囲の指定は1...self.lengthがいちばんしっくりきました。

class Array
    def bubble_sort
        loop {
            sorted = true
            for i in 1...self.length
                if self[i-1] > self[i]
                    self[i-1], self[i] = self[i], self[i-1]
                    sorted = false
                end
            end
            break if sorted
        }
        self
    end
end

p [ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 ].bubble_sort

追記(2008-07-19)
まつださんからのコメントを元に別バージョンを作りました。unsorted_lengthというのはちょっと誤解を招く変数名ですけれど。

class Array
    def bubble_sort
        unsorted_length = self.length
        loop {
            sorted = true
            for i in 1...unsorted_length
                if self[i-1] > self[i]
                    self[i-1], self[i] = self[i], self[i-1]
                    sorted = false
                end
            end
            break if sorted
            unsorted_length -= 1
        }
        self
    end
end
p [ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 ].bubble_sort