# 버블 μ •λ ¬ (Bubble Sort)

written by sohyeon, hyemin πŸ’‘


# 1. 버블 μ •λ ¬μ΄λž€?

버블 정렬은 μ΄μ›ƒν•œ 두 μš”μ†Œμ˜ λŒ€μ†Œ 관계λ₯Ό λΉ„κ΅ν•˜μ—¬ κ΅ν™˜μ„ λ°˜λ³΅ν•˜λŠ” 정렬이닀.

# 2. λ™μž‘ 방식

끝에 두 μš”μ†ŒλΆ€ν„° μ‹œμž‘ν•΄μ„œ 값을 λΉ„κ΅ν•˜κ³  κ΅ν™˜μ΄ ν•„μš”ν•˜λ©΄ κ΅ν™˜ν•˜λŠ” 과정을 λ°˜λ³΅ν•œλ‹€.
n-1회 비ꡐ, κ΅ν™˜μ„ ν•˜κ³  λ‚˜λ©΄ κ°€μž₯ μž‘μ€ μš”μ†Œκ°€ 맨 μ•žμœΌλ‘œ μ΄λ™ν•œλ‹€.
이 과정을 passλΌκ³ ν•œλ‹€.

pass과정이 n-1회 반볡되게 되며,
각 pass의 비ꡐ,κ΅ν™˜ 과정은 n-1, n-2, n-3, ... , 1 μ΄λ ‡κ²Œ 1νšŒμ”© 쀄어든닀.

비ꡐ κ΅ν™˜ κ³Όμ •μ˜ 합은 μ•„λž˜μ™€ κ°™λ‹€.

(n-1)+(n-2)+(n-3)+ ... + 1 = n(n-1)/2

# 3. νŠΉμ§•

# 1) μž₯점

  • κ΅¬ν˜„μ΄ 맀우 κ°„λ‹¨ν•˜λ‹€.

# 2) 단점

  • ν•˜λ‚˜μ˜ μš”μ†Œκ°€ κ°€μž₯ μ™Όμͺ½μ—μ„œ κ°€μž₯ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°°μ—΄μ—μ„œ λͺ¨λ“  λ‹€λ₯Έ μš”μ†Œλ“€κ³Ό κ΅ν™˜λ˜μ–΄μ•Ό ν•œλ‹€.

  • 특히 νŠΉμ • μš”μ†Œκ°€ μ΅œμ’… μ •λ ¬ μœ„μΉ˜μ— 이미 μžˆλŠ” κ²½μš°λΌλ„ κ΅ν™˜λ˜λŠ” 일이 μΌμ–΄λ‚œλ‹€.

  • 일반적으둜 자료의 κ΅ν™˜ μž‘μ—…(SWAP)이 자료의 이동 μž‘μ—…(MOVE)보닀 더 λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ—
    버블 정렬은 λ‹¨μˆœμ„±μ—λ„ λΆˆκ΅¬ν•˜κ³  거의 쓰이지 μ•ŠλŠ”λ‹€.

# 4. μ‹œκ°„λ³΅μž‘λ„

  • 비ꡐ 횟수

    • μ΅œμƒ, 평균, μ΅œμ•… λͺ¨λ‘ 일정 : n-1, n-2, … , 2, 1 번 = n(n-1)/2
  • κ΅ν™˜ 횟수

    • μž…λ ₯ μžλ£Œκ°€ μ—­μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ μžˆλŠ” μ΅œμ•…μ˜ 경우,
      ν•œ 번 κ΅ν™˜ν•˜κΈ° μœ„ν•˜μ—¬ 3번의 이동(SWAP ν•¨μˆ˜μ˜ μž‘μ—…)이 ν•„μš”ν•˜λ―€λ‘œ

      -> (비ꡐ 횟수 * 3) 번 = 3n(n-1)/2

    • μž…λ ₯ μžλ£Œκ°€ 이미 μ •λ ¬λ˜μ–΄ μžˆλŠ” μ΅œμƒμ˜ 경우,
      자료의 이동이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

T(n) = O(n^2)

# 5. 예제

# 1) 기본적인 버블 μ •λ ¬

import java.util.Scanner;

class BubbleSort {
	// a[idx1]와 a[idx2]의 값을 λ°”κΏ‰λ‹ˆλ‹€. 
	static void swap(int[] a, int idx1, int idx2) {
		int t = a[idx1]; 
		a[idx1] = a[idx2]; 
		a[idx2] = t;
	}

	// 버블 μ •λ ¬
	static void bubbleSort(int[] a, int n) {
		for (int i = 0; i < n - 1; i++)
			for (int j = n - 1; j > i; j--)
				if (a[j - 1] > a[j])
					swap(a, j - 1, j);
	}

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.println("버블 μ •λ ¬(버전 1)");
		System.out.print("μš”μ†Ÿμˆ˜οΌš");
		int nx = stdIn.nextInt();
		int[] x = new int[nx];

		for (int i = 0; i < nx; i++) {
			System.out.print("x[" + i + "]:");
			x[i] = stdIn.nextInt();
		}

		bubbleSort(x, nx);				// λ°°μ—΄ xλ₯Ό 버블 μ •λ ¬ν•©λ‹ˆλ‹€.

		System.out.println("μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν–ˆμŠ΅λ‹ˆλ‹€.");
		for (int i = 0; i < nx; i++)
			System.out.println("x[" + i + "]=" + x[i]);
	}
}

μœ„μ˜ 과정은 μ •μ§ν•˜κ²Œ μ•Œκ³ λ¦¬μ¦˜ 과정을 λ°˜μ˜ν•œ μ½”λ“œμ΄λ‹€.

ν•˜μ§€λ§Œ μ‹€μ œ μž…λ ₯이 적용된 μ•Œκ³ λ¦¬μ¦˜ 과정을 μ‚΄νŽ΄λ³΄λ©΄ λͺ¨λ“  passλ₯Ό n-1회 λ°˜λ³΅ν•  ν•„μš”κ°€ μ—†λ‹€.

일정 passμ—μ„œ κ΅ν™˜μ—†μ΄ λΉ„κ΅κ³Όμ •λ§Œ μ΄λ£¨μ–΄μ§€λŠ” κ²½μš°κ°€ μ‘΄μž¬ν•˜λŠ”λ°
κ·Έ 상황은 정렬이 μ™„λ£Œλ˜μ—ˆλ‹€λŠ” μ†Œλ¦¬μ™€ κ°™λ‹€.

κ΅ν™˜ 횟수λ₯Ό κΈ°λ‘ν•˜κ³  ν™•μΈν•˜λŠ” 쑰건이 μΆ”κ°€λœλ‹€λ©΄ λΆˆν•„μš”ν•œ λ°˜λ³΅μ„ 쀄일 수 μžˆλ‹€.

# 2) κ°œμ„ λœ μ½”λ“œ 1

static void bubbleSort(int[] a, int n){
    for(int i=0; i<n-1; i++){
        int exchg = 0;  // κ΅ν™˜ 횟수 기둝
        for(int j=n-1; j>i; j--){
            if(a[j-1]>a[j]){
                swqp(a, j-1, j);
                exchg++;
            }
        }
        if(exchg == 0) break;   // κ΅ν™˜μ΄ 이루어지지 μ•ŠμœΌλ©΄ μ’…λ£Œ
    }
}
Last Updated: 12/5/2020, 11:36:44 AM