{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번지의 값을 정하는 것)
}
}

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();
}
}
}

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