[자바 (JAVA)] 20. 버블 정렬

귤's avatar
Feb 11, 2025
[자바 (JAVA)] 20. 버블 정렬
💡
{5,4,3,2,1} 배열 크기 N
한 회전마다 마지막 index의 값을 찾는다.
전체 회전수는 allRound = N-1이다.
회전마다 반복되는 count는 N-1, N-2, N-3, N-4

STEP 1.

💡
마지막 index 값을 찾는 한 번의 회전만 테스트
package algo; // {1,2,3,5,4} public class Bubble02 { public static void main(String[] args) { // 인접한 두 수를 비교하고 교환 int[] arr = {5, 3, 1, 2, 4}; // 회전수는 N-1 // 1회전 (목표 : 4번지의 값을 정하는 것) // 1-1 --------------------------------------- if (arr[0] > arr[1]) { // 교환 조건 int temp = arr[1]; // temp = 3; arr[1] = arr[0]; arr[0] = temp; } // {3,5,1,2,4} // 1-2 ---------------------------------------- if (arr[1] > arr[2]) { // 교환 조건 int temp = arr[2]; arr[2] = arr[1]; arr[1] = temp; } // {3,1,5,2,4} // 1-3 if (arr[2] > arr[3]) { // 교환 조건 int temp = arr[3]; arr[3] = arr[2]; arr[2] = temp; } // {3,1,2,5,4} // 1-4 if (arr[3] > arr[4]) { // 교환 조건 int temp = arr[4]; arr[4] = arr[3]; arr[3] = temp; } // {3,1,2,4,5} // 2회전 (목표 : 3번지의 값을 정하는 것) // 3회전 (목표 : 2번지의 값을 정하는 것) // 4회전 (목표 : 1번지의 값을 정하는 것) } }

STEP 2. 1회전 공통 모듈 찾기

package algo; // {1,2,3,5,4} public class Bubble03 { public static void main(String[] args) { // 인접한 두 수를 비교하고 스왑(교환) int[] arr = {5, 3, 1, 2, 4}; // 회전수는 N-1 // 1회전 (목표 : 4번지의 값을 정하는 것) int a = 0; for (int i = 0; i < 4; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ","); } System.out.println(); // 2회전 (목표 : 3번지의 값을 정하는 것) // 3회전 (목표 : 2번지의 값을 정하는 것) // 4회전 (목표 : 1번지의 값을 정하는 것) } }
notion image

3. 전체 회전 공통 모듈 찾기

💡
매 회전마다 의 최대값 4, 3, 2, 1을 변수화 시키지 못했다.
package algo; // {1,2,3,5,4} // 공통 모듈 찾아내기 public class Bubble04 { public static void main(String[] args) { // 인접한 두 수를 비교하고 스왑(교환) int[] arr = {5, 4, 3, 2, 1}; // 샘플 최악으로 변경하기 int a = 0; // 탐색 시작 index int n = arr.length; // 배열의 크기 int r = 0; // 라운드 int c = 0; // 라운드마다 반복 횟수 // 회전수는 N-1 // 1(r)회전 (목표 : 4번지의 값을 정하는 것)------------------------------- r++; a = 0; c = n - r; // 4 for (int i = 0; i < c; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ", "); } System.out.println(); // 2회전 (목표 : 3번지의 값을 정하는 것)------------------------------- r++; a = 0; c = n - r; // 3 for (int i = 0; i < c; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ", "); } System.out.println(); // 3회전 (목표 : 2번지의 값을 정하는 것)------------------------------- r++; a = 0; c = n - r; // 2 for (int i = 0; i < c; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ", "); } System.out.println(); // 4회전 (목표 : 1번지의 값을 정하는 것)------------------------------- r++; a = 0; c = n - r; // 1 for (int i = 0; i < c; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ", "); } System.out.println(); } }

4. 반복

package algo; // {1,2,3,5,4} // 공통 모듈 찾아내기 public class Bubble05 { public static void main(String[] args) { // 인접한 두 수를 비교하고 스왑(교환) int[] arr = {5, 4, 3, 2, 1}; // 샘플 최악으로 변경하기 int a = 0; // 탐색 시작 index final int N = arr.length; // 배열의 크기 int r = 0; // 라운드 int c = 0; // 라운드마다 반복 횟수 // 회전수는 N-1 // 1(r)회전 (목표 : 4번지의 값을 정하는 것)------------------------------- for (int round = 0; round < N - 1; round++) { r++; a = 0; c = N - r; // 4,3,2,1 for (int i = 0; i < c; i++) { if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < 5; i++) { System.out.print(arr[i] + ", "); } System.out.println(); } } }
notion image

5. 시간 복잡도 계산

package algo; public class Bubble { public static void main(String[] args) { // 1. 초기 세팅 int[] arr = {15, 13, 12, 11, 7, 10, 9, 8}; int a; // 시작 index final int N = arr.length; // 배열의 크기 int r = 0; // 시간복잡도 // 첫항 : 1, 마지막항 N-1 // 가우스연산 (끝) int myCount = Util.gauss(1, N - 1); System.out.println("myCount : " + myCount); int count = 0; for (int k = 0; k < N - 1; k++) { a = 0; r++; for (int i = 0; i < N - r; i++) { count++; System.out.print("."); if (arr[a] > arr[a + 1]) { // 교환 조건 int temp = arr[a + 1]; // temp = 3; arr[a + 1] = arr[a]; arr[a] = temp; } a++; } for (int i = 0; i < N; i++) { System.out.print(arr[i] + ", "); } System.out.println(); } System.out.println("시간복잡도 : 배열크기(" + N + ") : " + count); } }

6. 버블 정렬 시간 복잡도 증명

버블정렬 시간복잡도 O((n^2-n) / 2) = O(n^2) 증명 n = 2일때 1번 n = 3일때 3번 (1+2) n = 4일때 6번 (1+2+3) n = 5일때 10번 (1+2+3+4) n = 6일때 15번 (1+2+3+4+5) ..... n일 때 (1+2+3+...+n-1) 번 총 더하는 횟수 : n-1번 (항의 수) 첫 항 : 1 마지막 항 : n-1 가우스 연산 적용 : 합 S = (첫 항 a + 마지막 항 l) * 항의 수 n / 2 (n-1 + 1) * (n-1) / 2 = n(n-1) / 2
💡
  • n이 계속 무한대로 커진다는 것을 가정했을 때,
  • n의 제곱에서 /2나 -n은 n의 제곱에 영향을 줄 수 없기 때문에 시간복잡도 = O(n^2)로 표기 가능
 
Share article

gyul