안녕하세요, NerbCodeX입니다! 😊
코로나로 인해 생활 패턴이 많이 달라지고 힘든 시간을 보내고 계실 텐데요, 이럴 때일수록 멘탈 관리와 꾸준한 학습이 중요합니다. 오늘도 자바 학습으로 한 걸음 나아가봅시다.
오늘은 자바 배열에서 정렬(Sorting)에 대해 배워보겠습니다. 배열을 사용할 때 꼭 필요한 작업 중 하나가 데이터 정렬인데요, 자바는 기본적으로 Arrays.sort() 메소드를 제공하여 손쉽게 정렬할 수 있습니다. 하지만 정렬 알고리즘의 개념과 동작 원리를 이해하면 더 효율적인 코드를 작성할 수 있습니다.
특히, Bubble Sort(버블 정렬)는 정렬 알고리즘 중 가장 기본적이고 이해하기 쉬운 방법으로, 학습의 첫 단계로 적합합니다. 이번 글에서는 Bubble Sort의 원리와 구현 방법을 살펴보고, 정렬 효율을 높이는 방법도 함께 알아보겠습니다.
그럼, 정렬 알고리즘의 세계로 함께 가보시죠! 😊
정렬의 개요
정렬의 필요 조건
- Key
- 차순
정렬의 종류
- bubble, selection, radix, quick ...
위에도 언급한 정렬 sort() 메소드는 정렬의 종류 중에 quicksort 알고리즘을 사용합니다. 다양한 종류의 정렬 알고리즘 중에 어떤 정렬을 사용하는지에 따라 그 효율성에 차이가 생깁니다.
우선 이중에서 가장 기본이 되는 Bubble Sort에 대해서 알아보도록 하겠습니다.
Bubble Sort
예제) {10, 30, 70, 90, 5}를 큰수부터 작은수로 정렬하라
해당 배열을 위와 같다고 생각하면 앞에부터 순차 비교를 진행한다.
- 1차 비교
위와 같은 1차 비교로 다음과 같은 결과를 얻게 된다.
- 2차 비교
맨 뒤의 5는 가장 작은 수라 이제 그 앞의 4개의 수를 비교 정렬하게 된다. 위의 2차 비교로 아래의 결과를 얻게 된다.
- 3차 비교
3차 비교까지 진행하고 나면 결과가 나온듯하다.
이로써 우리가 원하는 5개의 숫자에 대한 정렬을 3번의 비교를 통해 얻게 되었다. 이를 배열로 정리해 보면 다음과 같은 2차원 배열이 필요하다.
- 5개의 숫자의 정렬을 위해 필요한 최대 비교 수 (1,2)(2,3)(3,4)(4,5)(1,2)(2,3)(3,4)(4,5)
- (1,2)(2,3)(3,4)(4,5)
- (1,2)(2,3)(3,4)(4,5)
- {10, 30, 70, 90, 5)
- 세로 i=1,4 / 가로 j=1,4
그럼 Bubble Sort정렬을 위한 배열 공식을 알아보자 .
Bubble Sort 정렬을 위한 배열 공식 - 방법1
예제) 5개의 배열의 수의 크기를 비교하는 공식
int[] k= {10,30,24,78,9}; //정렬한 배열
- 우선 1열의 비교 k(2) : k(3) 간의 비교 k(4) : k(5) 간의 비교
- k(3) : k(4) 간의 비교
- k(1) : k(2) 간의 비교
- 실제 행열에서의 번호 (1~5대신에 0~4로) k(1) : k(2) 간의 비교k(3) : k(4) 간의 비교
- k(2) : k(3) 간의 비교
- k(0) : k(1) 간의 비교
- 열은 j이면 j:j+1의 비교
- k(j) : k(j+1) 간의 비교
- 배열 공식 코드 (비교 공식 if)
for (int i = 0; i < 4; i++) { //행 비교를 위해 4번을 비교
for (int j = 0; j < 4; j++) { // 열 비교를 위해 4번을 비교
if(k[j]<k[j+1]) { //앞에가 크거나 작으면 안바꾸나, 뒤가 크면 자리를 바꾼다.
int tmp=k[j]; //swap하기 위해 변수 tmp 생성
k[j]=k[j+1];
k[j+1]=tmp;
}// if end
}// for j end, if 비교를 4번(열)
}//for i end, if 비교를 4*4번(행)
- 출력 결과
이를 비교할 숫자의 길이를 변경할 수 있게 바꾼다.
즉 for문의 비교 숫자를 i<4가 아닌 i<k.length-1로 해도 된다.
for (int i = 0; i < k.length-1; i++) {
for (int j = 0; j < k.length-1; j++) {
위와 같이 적용하면 배열의 숫자 길이와 무관하게 적용된다.
int[] k= {10,30,24,78,9,33,21,34}; //정렬한 배열
for (int i = 0; i < k.length-1; i++) { //행 비교를 위해 4번을 비교 , i<k.length-1
for (int j = 0; j < k.length-1; j++) { // 열 비교를 위해 4번을 비교 , j<k.length-1
if(k[j]<k[j+1]) { //앞에가 크거나 작으면 안바꾸나, 뒤가 크면 자리를 바꾼다.
int tmp=k[j]; //swap하기 위해 변수 tmp 생성
k[j]=k[j+1];
k[j+1]=tmp;
}// if end
}// for j end, if 비교를 4번(열)
}//for i end, if 비교를 4*4번(행)
- 출력 결과
Bubble 비교의 개선안 - 방법2
위의 1번째 방법의 문제점은 이미 비교한 뒷 부분을 중복 비교한다는 부분이다.
뒷부분에 불필요한 비교를 제외하는 방법을 사용한다.
{10, 30, 70, 90, 5)
(1,2)(2,3)(3,4)(4,5) : 4번
(1,2)(2,3)(3,4)(4,5) : 3번
(1,2)(2,3)(3,4)(4,5) : 2번
(1,2)(2,3)(3,4)(4,5) : 1번
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4-i; j++) {//열에서 행으로 갈때 마다 하나씩 빼준다.
if(k[j]<k[j+1]) {
int tmp=k[j];
k[j]=k[j+1];
k[j+1]=tmp;
}// if end
}// for j end
}//for i end
위 방법으로 for (int j = 0; j < 4; j++) --> for (int j = 0; j < 4-i; j++) 16번 반복을 10번 반복으로 줄일 수 있다.
마찬가지로 4, 4-i대신에 k.length를 써도 된다.
for (int i = 0; i < k.length-1; i++) {
for (int j = 0; j < k.length-1-i; j++) {//열에서 행으로 갈때 마다 하나씩 빼준다.
if(k[j]<k[j+1]) {
int tmp=k[j];
k[j]=k[j+1];
k[j+1]=tmp;
}// if end
}// for j end
}//for i end
Bubble 비교의 개선안 - 방법3(스위치 기법)
다른 개선 방법으로는 중간에 정렬이 완료되었을 때 이후에 검사를 중단하고 마무리 한다.
중간에 검사를 하는 코드가 추가되어 검사 회수는 줄지만 빠르다고 장담할 수는 없다.
{30,70,90,10,5)
(1,2)(2,3)(3,4)(4,5) :
(1,2)(2,3)(3,4)(4,5) : // 이미 정렬이 끝나 뒤쪽이 필요 없게 된다.
(1,2)(2,3)(3,4)(4,5) :
(1,2)(2,3)(3,4)(4,5) :
- 문제) 10개의 배열 index안에 학생들의 키가 있다. 이를 키 오름차순으로 sort하고 출력하시오, 단 자바의 sort api를 사용하지 마시오
public static void main(String[] args) {
int[] ki= {175, 180, 174, 185, 165, 160, 174, 181, 179, 169};
//원본 데이터 출력
for (int i = 0; i < ki.length; i++) {
System.out.print(ki[i]+"\t");
}
System.out.println();
// 정렬
for (int i = 0; i < ki.length-1; i++) {
for (int j = 0; j < ki.length-1-i; j++) {
if(ki[j]>ki[j+1]) { // 오름차순으로 부호 바꿈
int tmp=ki[j];
ki[j]=ki[j+1];
ki[j+1]=tmp;
}//if end
}// for j end
}// for i end
System.out.println();
//정렬 데이터 출력
for (int i = 0; i < ki.length; i++) {
System.out.print(ki[i]+"\t");
}
System.out.println();
}// main end
- 출력 결과
자바에서 제공하는 sort 메소드
import java.util.Arrays;
...
int[] bae= {10,90,100,60,70};
Arrays.sort(bae); //
import java.util.Arrays;
...
int[] bae= {10,90,100,60,70};
Arrays.sort(bae);
for (int i = 0; i < bae.length; i++) {
System.out.print(bae[i]+"\t");
}
System.out.println();
- 출력 결과 (기본 오름차순 정렬)
- 내림차순 출력할때 코드
for (int i = bae.length-1; i>=0 ; i--) {
System.out.print(bae[i]+"\t");
}
System.out.println();
오늘은 자바에서 Bubble Sort를 활용한 정렬 알고리즘과 이를 최적화하는 다양한 방법을 배워보았습니다. 또한, 자바에서 제공하는 Arrays.sort() 메소드를 사용하여 더욱 간편하게 정렬할 수 있는 방법도 살펴보았죠.
정렬은 데이터의 효율적인 처리를 위해 매우 중요한 부분입니다. Bubble Sort처럼 단순한 정렬부터 시작해, 점점 더 복잡한 정렬 알고리즘(Quick Sort, Merge Sort 등)을 학습하면 프로그래밍의 기본기를 탄탄히 다질 수 있습니다.
다음 시간에는 정렬의 연장선으로 검색(Search)에 대해 다룰 예정입니다. 정렬된 데이터를 기반으로 데이터를 효율적으로 검색하는 다양한 방법과 알고리즘을 배워볼 예정이니 많은 기대 부탁드립니다.
학습은 작은 한 걸음부터 시작됩니다. 오늘 배운 내용을 반복 연습하며 코딩 실력을 키워보세요! 😊
그럼 다음 시간에 또 뵙겠습니다. 감사합니다!
Java Day 10: 2차원 배열 기초와 실습 예제 총정리
안녕하세요, NerdCodeX입니다! 😊지난 시간에 1차원 배열의 기초와 실습을 다뤘는데요, 오늘은 그 연장선으로 2차원 배열을 살펴보겠습니다.2차원 배열이란 무엇일까요?2차원 배열은 행(Row)과 열(Co
nerdcodex.tistory.com
Java Day 9: 배열의 기본 개념과 실습 - 1차원 배열 쉽게 배우기
안녕하세요, NerdCodeX입니다! 😊오랜만에 자바 학습 포스팅으로 돌아왔습니다. 오늘은배열(Array)에 대해 알아보겠습니다. 배열은 자바뿐만 아니라 모든 프로그래밍 언어에서 데이터 관리를 위해
nerdcodex.tistory.com
'자바(Java)' 카테고리의 다른 글
Java Day 10: 2차원 배열 기초와 실습 예제 총정리 (0) | 2025.01.29 |
---|---|
Java Day 9: 배열의 기본 개념과 실습 - 1차원 배열 쉽게 배우기 (0) | 2025.01.28 |
Java Day 8: 오버로딩(Method Overloading) 완벽 정리와 실전 예제 (0) | 2025.01.27 |
Java Day 7: 메소드 완벽 이해와 실습 - 함수형 프로그래밍 시작하기 (0) | 2025.01.26 |
Java Day 6: Switch와 While 반복문으로 프로그래밍 기본기 강화하기 (1) | 2025.01.25 |