# 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




