# coding: utf-8
# Bubble sort: A very naive sort that keeps swapping elements until the container
# is sorted. Requirements: Needs to be able to compare elements with <=>, and
# the [] []= methods should be implemented for the container. Time Complexity:
# О(n^2). Space Complexity: О(n) total, O(1) auxiliary. Stable: Yes.
#
# [5, 4, 3, 1, 2].bubble_sort! => [1, 2, 3, 4, 5]

class Array
  def swap(first, second)
    self[first], self[second] = self[second], self[first]
    self
  end

  def bubble_sort!
    loop do
      swapped = false
      (self.size - 1).times do |index|
        if self[index] > self[index + 1]
          swap index, index + 1
          swapped = true
        end
      end
      break unless swapped
    end

    self
  end

  # def bubble_sort!
  #   length.times do |j|
  #     for i in 1...(length - j)
  #       swap i - 1, i if self[i - 1] < self[i]
  #     end
  #   end
  #
  #   self
  # end
  #
  # def bubble_sort!
  #   each_index do |index|
  #     (length - 1).downto( index ) do |i|
  #       swap i - 1, i if self[i - 1] < self[i]
  #     end
  #   end
  #
  #   self
  # end
end
