JAVA 버블정렬 알고리즘 구성과정

#JAVA005 #버블정렬 #알고리즘구성과정 #모듈화작업
Dec 16, 2023
JAVA 버블정렬 알고리즘 구성과정
 
 

🍎 버블 정렬의 개요

버블 정렬은 컴퓨터 과학에서 가장 기본적인 정렬 알고리즘 중 하나이다. 이 알고리즘의 기본 아이디어는 배열을 반복적으로 순회하면서 인접한 요소들을 비교하고, 필요한 경우 그 위치를 바꾸는 것이라 할 수 있다. 이 반복되는 과정 속에서 큰 값들이 뒤로 “거품( bubble)”처럼 서서히 올라가게 되는데, 이러한 이유로 버블정렬이라 불린다.
 
그리고 이번 시간에서는 이 버블정렬의 알고리즘을 구조적으로 분해하여서 어떻게 함축된 알고리즘으로 발전해 나가는 걸 보면서 연습을 하게 될 것이다. 버블 정렬의 단기적 목표는 다음과 같다.
 
 
💡
목표 : 무작위 순서의 배열을 오름차순으로 정리되게 할 것.
 
 
버블정렬의 시각적 이해
 
 
위에 보는 바와 같은 모습으로 무작위 배열이 오름차순 정렬이 되는 모습을 볼 수 있다. 이제부터는 코드를 구현하면서 버블 정렬 알고리즘을 만들어 볼 것 이다. 그리고 알고리즘을 간단하게 이해하고자 한다면 이렇게 생각하면 된다.
 
💡
알고리즘이란.. 컴퓨터가 따라 할 수 있도록 문제를 해결하는 절차나 방법을 자세히 설명하는 과정이다.
 
자 이제 시작 해보자.
 
 

🍊 버블 정렬의 개념을 구조화하기

 

버블정렬 개념의 구조화

배열을 오름차순으로 정리하기 위해서 일단 쉽게 테스트 할 수 있는 무작위의 5자리 숫자의 배열을 생성해보자.
 
필자는 { 5, 8, 2, 4, 3} 으로 임의로 정하겠다.
여기서 버블 개념의 시각화 그림에서 볼 수 있듯이 Roop를 1회전이라 정하면, 6가지 요소를 가진 배열은 5회전 만에 정리가 되는 모습을 볼 수 있다. 물론 이 결론을 얻기 위해서는 다른 값으로 더 대입을 해봐야 되겠지만, 거기까지 가면 독자가 피곤할거라 판단하고 싣지 않았다..
 
 
버블 정렬 특징
  • 버블 정렬은 시작 주소값에서부터 두 요소를 비교하여 큰 값을 뒤로 보낸다.
  • N배열은 N-1회전으로 배열을 오름차순 정리가 된다.
  • 구현해야될 기능
    • 일단 5개 요소를 가진 배열로 알고리즘을 구현해본다. 작아야테스트 해보기 편하니까
    • 1회전4번의 스왑이 일어나야되고, 순차적으로 그 횟수가 -1씩 줄어야된다.
    • 스왑 기능을 따로 구현해본다.
 
 
일단 BubbleEx01클래스를 만들어서 해당 특징을 주석으로 따로 정리 하겠다.
위에 주석을 남겨놓고 계속 상기시킬 필요가 있다.
위에 주석을 남겨놓고 계속 상기시킬 필요가 있다.
 
 
 

🍐 첫 번째 미션 : 반복

 
무작위 배열을 만들고 4회전을 돌릴 코드 구성하기
notion image
  • int[] arr = {5, 8, 2, 4, 3}; 으로 5요소로 구성된 무작위 배열을 arr 에 할당한다.
  • 배열 arr의 길이를 N에 할당하고 final로 선언한다.
  • for구문을 간단하게 4바퀴 회전할 수 있게 만들고 테스트 해본다.
 
💡
여기서 작게 기능을 구현하고 테스트 해보는 것이 구조화 작업에서 중요하다.
 
결과값
결과값
  • 잘 작동한다
 
 
 

🥑 두 번째 미션 : 반복안에 반복

 
두 번째 미션 목표 반복문 안에서 반복할 수 있는 구조를 만든다. 하지만 동시에 회전을 돌면서 젤 큰 숫자가 젤 끝으로 정리가 되기 때문에, 다시 반복 회전 할때마다 1회 적게 반복해야된다.
notion image
  • 4번 순회하는 구문 밑에 반복문을 넣었다.
  • 매회전 마다 1회씩 더 작게 반복하기 위해서 상수 N-i를 해주었더니 목적에 맞게 잘 작동한다.
 
 
결과값
결과값
  • 처음 4번, 다음 3번, 2번, 1번 계획대로 잘 작동한다.
  • 이제 스왑기능을 구현하는 코드가 필요하다.
 
 

🍒 세 번째 미션 : 스왑

 
스왑기능 핵심 그냥 단순하게 배열 [0]이랑 배열[1]이랑 바꾼답시고 배열[0] = 배열[1]을 구현한다면 그저 배열[1]이 대입 될 뿐이다. 따라서 코드 구현 상에서는 배열 [0]의 값을 대신 받아줄 그릇이 필요하다.
notion image
  • 일단 배열을 4,3을 넣어보았다. 테스트하는데 굳이 복잡하게 할 필요없으니 두 개만 넣었다.
  • arr[0]값을 대신 받아줄temp를 int로 선언하였다.
  • 그리고 그 값들이 잘 바뀌었는지 실행하는 코드도 for-each구문으로 만들었다. 항상 테스트 해보고 다음 단계로 넘어가는 것이 중요하다.
 
 
결과값
결과값
  • 4,3이였던 배열이 3,4로 스왑이 되었다.
  • 스왑기능 완성했고, 구조는 유지하면서 변수 부분을 잘 체크 해야된다.
 
 
 

🍋 네 번째 미션 : 모듈화 (제일 중요!)

모듈화 작업 알고리즘의 시작점이라고 감히 말할 수 있다. 모듈화를 잘 구성하는 것이 확장 가능성에 있어서 제일 중요한 요소이다. 변수 이 외에는 변하지 않게 구조를 짜는 것이 중요하다.
notion image
  • 코드를 잘 보면 일단 4회전을 도는 코드를 만들기 전에 1회전을 도는 코드를 먼저 만들어 보고 잘 작동하는 지 테스트 해봐야된다.
  • 이런 경우에 기본 문법은 if - else if - else 를 쓰겠지만, 의도적으로 사용하지 않은 이유에 대해서는 밑에 따로 글 상자로 이유를 강조하고 싶다.
  • 보면 알겠지만 안에 변수 말고 바뀌는 코드가 없다. 이렇게 코드를 짜야 복붙이 가능하고 확장이 가능해진다. 이렇게 코드를 짜야 100명이든 만 명이든 백만명이 와도 변수만 수정하면 될 수 있게 만드는 것이 중요하고, 이것이 모듈화다.
 
💡
여기서 else if - else 를 쓰는 순간 모듈화 할 수 가 없다.
항상 모듈화 할 수 있는 방향, 그리고 확장가능성 (scalable 하게)으로 코드를 짜야지 프로그래머의 일을 줄여 줄수 있으며 알고리즘적 접근이라 할 수 있다. 내가 얼마나 코드를 잘 짜는지는 중요할 수 있다. 제일 중요한건 SCALABLE (확장가능한)이다.
 
 
결과값
결과값
  • 여기서 8일 제일 큰 수 이고, 스왑 기능을 사용해서 8이 의도했던 대로 제일 마지막에 배치가 되었다.
  • 버블 정렬이 10퍼 정도 완료가 되었다고 보면 될 것 같다.
  • 이제 1회전을 안전하게 돌릴 수 있는 코드를 만들었으니 줄일 수 있는 부분을 줄여나가 보겠다.
 
 
함수화 작업
notion image
  • 기존 1회전의 코드에서 변경되는 부분과 변경되지 않는 부분에서의 규칙성을 찾아서 함수로 교체 해주었다.
 
결과값
결과값
  • 결과값 역시 그대로 잘 나와주었다.
  • 이제 1회전의 코드 블럭을 완성하였다. 다음 작업은 이 코드 블럭과 아까 만들었던 반복안의 반복구문을 조화롭게 합쳐주는 일이다.
 
 

🍋 다섯 번째 미션 : 모듈 통합

 
모듈 통합 아까 반복안의 반복 구문을 만들면서 4-3-2-1 로 회전하는 코드 블럭을 만들었었다. 이제 제대로 작동하는 스왑 코드 블럭이 있으니, 이 두 코드 블럭을 잘 작동할 수 있게 합쳐주는 일이 남았다.
 
notion image
  • 아래 빨간 부분의 코드 블럭이 노랑 박스의 구조대로 들어가야된다.
  • 제일 중요한 특징은 내부 반복문의 N값이 i를 더 차감했다는 사실이다.
 
 
통합이 완료된 모습
통합이 완료된 모습
  • 노란 박스의 구조를 그대로 1회전 코드 블럭에 적용시키고, 그 코드 블럭을 그대로 노란색 박스에 대체시킨 모습이다.
  • 그리고 출력코드는 매 회전시 우리가 원했던 대로 적용되는 지 확인하기 위한 코드라 출력코드 블럭은 크게 신경 쓰지 않아도 된다.
 
 
결과값
결과값
  • 완성된 코드의 결과값이다.
  • 매 회전마다 제일 큰 수가 뒤에서 부터 차례로 정렬되는 것을 확인 할 수 있다.
  • 젤 아래 최종 값은 수의 크기가 오름차 순으로 깔끔하게 정리가 되었다.
 
 
 

🍇 버블 정렬 알고리즘이 작동하는 코드 블럭 완성

 
버블 정렬 알고리듬 코드블럭
notion image
  • 이렇게 완성이 되었다.
  • 이제 어떤 배열을 가져와도 오름차 순으로 정리가 될 것이다. … 한 번 시험해볼까??
 
 
수정된 배열
notion image
  • {99, 18, 12, 5, 8, 2, 4, 3, 9, 11}; 배열만 이렇게 수정해 보았다.
  • 다른 부분들은 모두 모듈화 해 놓았기 때문에 손을 댈 필요가 없다.
 
 
결과값
결과값
  • 예상대로 매 회전마다 제일 큰 수가 뒤로 차례로 배열되는 것을 각 라인에서 확인할 수 있다.
  • 이제 100개든, 만개이든, 백만개 이든 완성된 알고리즘 블럭을 이용하면 자동으로 버블 정렬이 될 것이다.
  • 완성된 모습을 보니 되게 뿌듯하다. 🙂
 
Share article
RSSPowered by inblog