마찬가지로 현재 보고 있는 책의 연습문제이다.

이미 정렬되어 있는 경우, 필요 없는 비교를 수행하지 않고 함수를 종료할 수 있도록 BubbleSort 를 수정하세요

버블 소트의 동작을 생각해 보면, 인근의 값을 비교하여 교환을 수행한다.

이미 정렬되어 있는 경우를 생각해보자.
a, b, c, d, e, f 가 정렬되어 있다면, a < b < c < d < e < f 이다.
다시 말하면... 첫 스텝 때 교환이 수행되지 않는다면, 배열은 이미 정렬되어 있다는 것이다.

몇 번째 스텝이라 해도 마찬가지이다.
스텝을 하나 적용했을 때, 나머지 부분이 이미 정렬되어 있다면 다음 스텝에서는 교환이 수행되지 않을 것이다.
그렇다면 차후 스텝은 의미가 없다.

이를 적용한 소스는 다음과 같다.

def print_array(array)
  puts array.map {|x| x.to_s + " "}.to_s
end

def bubble_sort(array)
  array_len = array.length

  (0..array_len - 1).each do |i|
    flag = nil

    (0..array_len - (i+2)).each do |j|
      puts "."

      if array[j] > array[j+1]
        array[j], array[j+1] = array[j+1], array[j]
        flag = true
      end
    end

    return if !flag
  end
end

array_sorted = [1,2,3,4,5,6]

bubble_sort(array_sorted)
print_array(array_sorted)
위와 같이 완전히 정렬된 6개의 원소를 가진 배열을 정렬하면 '.' 은 총 5번만 출력된다.
array 를 [1,2,6,3,4,5] 로 변경하면 '.' 은 총 9번(5번 + 4번) 출력되고 정렬이 완료된다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Heart