🍎 버블 정렬의 개요
버블 정렬은 컴퓨터 과학에서 가장 기본적인 정렬 알고리즘 중 하나이다. 이 알고리즘의 기본 아이디어는 배열을 반복적으로 순회하면서 인접한 요소들을 비교하고, 필요한 경우 그 위치를 바꾸는 것이라 할 수 있다. 이 반복되는
과정 속에서 큰 값들이 뒤로 “거품( bubble)”처럼 서서히 올라가게 되는데
, 이러한 이유로 버블정렬이라 불린다. 그리고 이번 시간에서는 이 버블정렬의 알고리즘을 구조적으로 분해하여서 어떻게 함축된 알고리즘으로 발전해 나가는 걸 보면서 연습을 하게 될 것이다. 버블 정렬의 단기적 목표는 다음과 같다.
목표 : 무작위 순서의 배열을 오름차순으로 정리되게 할 것.
버블정렬의 시각적 이해
위에 보는 바와 같은 모습으로 무작위 배열이 오름차순 정렬이 되는 모습을 볼 수 있다. 이제부터는 코드를 구현하면서 버블 정렬 알고리즘을 만들어 볼 것 이다. 그리고 알고리즘을 간단하게 이해하고자 한다면 이렇게 생각하면 된다.
알고리즘이란..
컴퓨터가 따라 할 수 있도록 문제를 해결하는 절차나 방법을
자세히 설명
하는 과정이다. 자 이제 시작 해보자.
🍊 버블 정렬의 개념을 구조화하기
버블정렬 개념의 구조화
배열을 오름차순으로 정리하기 위해서 일단 쉽게 테스트 할 수 있는 무작위의 5자리 숫자의 배열을 생성해보자.
필자는
{ 5, 8, 2, 4, 3}
으로 임의로 정하겠다. 여기서 버블 개념의 시각화 그림에서 볼 수 있듯이
Roop
를 1회전이라 정하면, 6가지 요소
를 가진 배열은 5회전
만에 정리가 되는 모습을 볼 수 있다. 물론 이 결론을 얻기 위해서는 다른 값으로 더 대입을 해봐야 되겠지만, 거기까지 가면 독자가 피곤할거라 판단하고 싣지 않았다.. 버블 정렬 특징
- 버블 정렬은 시작 주소값에서부터 두 요소를 비교하여 큰 값을 뒤로 보낸다.
- N배열은 N-1회전으로 배열을 오름차순 정리가 된다.
- 구현해야될 기능
- 일단 5개 요소를 가진 배열로 알고리즘을 구현해본다. 작아야테스트 해보기 편하니까
-
1회전
때4번
의 스왑이 일어나야되고, 순차적으로 그 횟수가-1
씩 줄어야된다. - 스왑 기능을 따로 구현해본다.
일단
BubbleEx01
클래스를 만들어서 해당 특징을 주석으로 따로 정리 하겠다. 🍐 첫 번째 미션 : 반복
무작위 배열을 만들고 4회전을 돌릴 코드 구성하기
int[] arr = {5, 8, 2, 4, 3};
으로 5요소로 구성된 무작위 배열을arr
에 할당한다.
- 배열
arr
의 길이를N
에 할당하고final
로 선언한다.
for구문
을 간단하게 4바퀴 회전할 수 있게 만들고 테스트 해본다.
여기서 작게 기능을 구현하고 테스트 해보는 것이 구조화 작업에서 중요하다.
- 잘 작동한다
🥑 두 번째 미션 : 반복안에 반복
두 번째 미션 목표반복문 안에서 반복
할 수 있는 구조를 만든다. 하지만 동시에 회전을 돌면서 젤 큰 숫자가 젤 끝으로 정리가 되기 때문에, 다시 반복 회전 할때마다1회 적게 반복
해야된다.
- 4번 순회하는 구문 밑에 반복문을 넣었다.
- 매회전 마다 1회씩 더 작게 반복하기 위해서 상수
N
에-i
를 해주었더니 목적에 맞게 잘 작동한다.
- 처음 4번, 다음 3번, 2번, 1번 계획대로 잘 작동한다.
- 이제 스왑기능을 구현하는 코드가 필요하다.
🍒 세 번째 미션 : 스왑
스왑기능 핵심 그냥 단순하게 배열 [0]이랑 배열[1]이랑 바꾼답시고배열[0] = 배열[1]
을 구현한다면 그저 배열[1]이 대입 될 뿐이다. 따라서 코드 구현 상에서는 배열 [0]의 값을대신 받아줄 그릇이 필요
하다.
- 일단 배열을 4,3을 넣어보았다. 테스트하는데 굳이 복잡하게 할 필요없으니 두 개만 넣었다.
arr[0]
값을 대신 받아줄temp
를 int로 선언하였다.
- 그리고 그 값들이 잘 바뀌었는지 실행하는 코드도
for-each구문
으로 만들었다. 항상 테스트 해보고 다음 단계로 넘어가는 것이 중요하다.
- 4,3이였던 배열이 3,4로 스왑이 되었다.
- 스왑기능 완성했고, 구조는 유지하면서 변수 부분을 잘 체크 해야된다.
🍋 네 번째 미션 : 모듈화 (제일 중요!)
모듈화 작업 알고리즘의 시작점이라고 감히 말할 수 있다. 모듈화를 잘 구성하는 것이 확장 가능성에 있어서 제일 중요한 요소이다.변수 이 외에는 변하지 않게 구조를 짜는 것이 중요
하다.
- 코드를 잘 보면 일단 4회전을 도는 코드를 만들기 전에 1회전을 도는 코드를 먼저 만들어 보고 잘 작동하는 지 테스트 해봐야된다.
- 이런 경우에 기본 문법은
if - else if - else
를 쓰겠지만, 의도적으로 사용하지 않은 이유에 대해서는 밑에 따로 글 상자로 이유를 강조하고 싶다.
- 보면 알겠지만 안에 변수 말고 바뀌는 코드가 없다. 이렇게 코드를 짜야 복붙이 가능하고 확장이 가능해진다. 이렇게 코드를 짜야 100명이든 만 명이든 백만명이 와도
변수만 수정하면 될 수 있게 만드는 것
이 중요하고, 이것이 모듈화다.
여기서
else if - else
를 쓰는 순간 모듈화 할 수 가 없다. 항상 모듈화 할 수 있는 방향, 그리고 확장가능성 (scalable 하게)으로 코드를 짜야지 프로그래머의 일을 줄여 줄수 있으며 알고리즘적 접근이라 할 수 있다. 내가 얼마나 코드를 잘 짜는지는 중요할 수 있다. 제일 중요한건
SCALABLE (확장가능한)
이다. - 여기서 8일 제일 큰 수 이고, 스왑 기능을 사용해서 8이 의도했던 대로 제일 마지막에 배치가 되었다.
- 버블 정렬이 10퍼 정도 완료가 되었다고 보면 될 것 같다.
- 이제 1회전을 안전하게 돌릴 수 있는 코드를 만들었으니 줄일 수 있는 부분을 줄여나가 보겠다.
함수화 작업
- 기존 1회전의 코드에서 변경되는 부분과 변경되지 않는 부분에서의
규칙성
을 찾아서함수로 교체
해주었다.
- 결과값 역시 그대로 잘 나와주었다.
- 이제
1회전의 코드 블럭을 완성
하였다. 다음 작업은 이 코드 블럭과 아까 만들었던반복안의 반복구문
을 조화롭게 합쳐주는 일이다.
🍋 다섯 번째 미션 : 모듈 통합
모듈 통합 아까반복안의 반복 구문
을 만들면서 4-3-2-1 로 회전하는 코드 블럭을 만들었었다. 이제 제대로 작동하는 스왑 코드 블럭이 있으니, 이 두 코드 블럭을 잘 작동할 수 있게 합쳐주는 일이 남았다.
- 아래 빨간 부분의 코드 블럭이 노랑 박스의 구조대로 들어가야된다.
- 제일 중요한 특징은 내부 반복문의 N값이 i를 더 차감했다는 사실이다.
- 노란 박스의 구조를 그대로 1회전 코드 블럭에 적용시키고, 그 코드 블럭을 그대로 노란색 박스에 대체시킨 모습이다.
- 그리고 출력코드는 매 회전시 우리가 원했던 대로 적용되는 지 확인하기 위한 코드라 출력코드 블럭은 크게 신경 쓰지 않아도 된다.
- 완성된 코드의 결과값이다.
- 매 회전마다 제일 큰 수가 뒤에서 부터 차례로 정렬되는 것을 확인 할 수 있다.
- 젤 아래 최종 값은 수의 크기가 오름차 순으로 깔끔하게 정리가 되었다.
🍇 버블 정렬 알고리즘이 작동하는 코드 블럭 완성
버블 정렬 알고리듬 코드블럭
- 이렇게 완성이 되었다.
- 이제 어떤 배열을 가져와도 오름차 순으로 정리가 될 것이다. … 한 번 시험해볼까??
수정된 배열
{
99, 18, 12, 5, 8, 2, 4, 3, 9, 11
}
;
배열만 이렇게 수정해 보았다.
- 다른 부분들은 모두 모듈화 해 놓았기 때문에 손을 댈 필요가 없다.
- 예상대로 매 회전마다 제일 큰 수가 뒤로 차례로 배열되는 것을 각 라인에서 확인할 수 있다.
이제 100개든, 만개이든, 백만개 이든 완성된 알고리즘 블럭을 이용하면 자동으로 버블 정렬이 될 것
이다.
- 완성된 모습을 보니 되게 뿌듯하다. 🙂
Share article