πŸ“‚ 자료ꡬ쑰/μ •λ ¬

버블 μ •λ ¬(Bubble Sort)

Amenable 2023. 3. 4. 18:30

  κ±°ν’ˆ 정렬이라고도 λΆˆλ¦¬λŠ” 버블 정렬에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

1. μ •μ˜ πŸ‘Ÿ

버블 μ •λ ¬

  버블 정렬은 μ„œλ‘œ μΈμ ‘ν•œ 두 μ›μ†Œλ₯Ό κ²€μ‚¬ν•˜μ—¬ μ •λ ¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

 

2. λ™μž‘ 방식 πŸ‘ž

  N개의 μ›μ†Œκ°€ μžˆλ‹€κ³  ν•˜μž.
  첫 번째 μ›μ†Œμ™€ 두 번째 μ›μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ§Œμ•½ 첫 번째 μ›μ†Œκ°€ 더 크닀면 λ‘˜μ˜ 자리λ₯Ό λ°”κΏ”μ€€λ‹€. 그리고 두 번째 μ›μ†Œμ™€ μ„Έ 번째 μ›μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ§Œμ•½ 두 번째 μ›μ†Œκ°€ 더 크닀면 λ‘˜μ˜ 자리λ₯Ό λ°”κΏ”μ€€λ‹€. μ΄λŸ¬ν•œ λ™μž‘을 (λ§ˆμ§€λ§‰ - 1) 번째의 μ›μ†Œμ™€ λ§ˆμ§€λ§‰ μ›μ†Œλ₯Ό λΉ„ꡐ할 λ•ŒκΉŒμ§€ μˆ˜ν–‰ν•œλ‹€.
  이것이 1νšŒμ „ μˆ˜ν–‰ν•œ 것이닀. μ΄λ ‡κ²Œ 되면 λ§ˆμ§€λ§‰μ— μœ„μΉ˜ν•œ μ›μ†Œκ°€ κ°€μž₯ 큰 μ›μ†Œκ°€ λœλ‹€. 2νšŒμ „μ„ μˆ˜ν–‰ν•  λ•Œ λ§ˆμ§€λ§‰ μ›μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ“€μ„ μ •λ ¬ν•΄ μ€€λ‹€. (N - 1) νšŒμ „κΉŒμ§€ μˆ˜ν–‰ν•˜λ©΄ μ •렬이 λ§ˆλ¬΄λ¦¬λœλ‹€.
  μœ„μ˜ 방식은 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 정렬을 ν•˜κ³  μžˆλ‹€. λ§Œμ•½ λŒ€μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ’€μ˜ μ›μ†Œκ°€ 더 클 λ•Œ μ•žμ˜ μ›μ†Œμ™€ 자리λ₯Ό λ°”κΎΌλ‹€λ©΄ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 정렬을 ν•  수 μžˆλ‹€.

 

3. κ΅¬ν˜„(JAVA) πŸ₯Ύ

static void bubbleSort(int[] arr) {
    int temp = 0;
    // (μ›μ†Œμ˜ 개수 - 1)번 반볡
    for(int i = 0; i < arr.length - 1; i++) {
        // μΈμ ‘ν•œ 두 μ›μ†Œλ₯Ό λŒ€μ†ŒλΉ„κ΅
        // νšŒμ „ μˆ˜κ°€ 증가함에 λ”°λΌμ„œ 정렬이 된 뒀에 μžˆλŠ” μ›μ†Œλ“€μ€ λΉ„κ΅μ—μ„œ μ œμ™Έ
        for(int j = 1; j < arr.length - i; j++) {
            if(arr[j - 1] < arr[j]) {
                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

 

4. μ‹œκ°„λ³΅μž‘λ„ & κ³΅κ°„λ³΅μž‘λ„ πŸ‘’

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

  μœ„μ—μ„œ μ‚΄νŽ΄λ΄€λ“―μ΄ 총 (N - 1)번 νšŒμ „ν•˜κ³ , i번째 νšŒμ „μ—μ„œ (N - i)의 연산을 μˆ˜ν–‰ν•œλ‹€. 그러면, μ•„λž˜μ— ν•΄λ‹Ήν•˜λŠ” 수만큼 연산을 μˆ˜ν–‰ν•œλ‹€.

(N - 1) + (N - 2) + (N - 3) + ... + 2 + 1 = N * (N -1) / 2

  λ”°λΌμ„œ, μ‹œκ°„λ³΅μž‘λ„λŠ” O(N^2)이닀.
  정렬이 λ˜μ–΄μžˆλ˜ μ•ˆλ˜μ–΄ 있던 항상 비ꡐλ₯Ό μˆ˜ν–‰ν•˜λ―€λ‘œ μ΅œμ„ , 평균, μ΅œμ•…μ˜ μƒν™©μ—μ„œ λͺ¨λ‘ O(N^2)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§„λ‹€.

  μ΅œμ„ (BEST) 평균(AVERAGE) μ΅œμ•…(WORST)
μ‹œκ°„λ³΅μž‘λ„ O(N^2) O(N^2) O(N^2)

2. κ³΅κ°„λ³΅μž‘λ„

  κ³΅κ°„λ³΅μž‘λ„μ˜ κ²½μš° μΆ”가적인 λ°°μ—΄μ„ λ§Œλ“€μ§€ μ•Šκ³  ν•΄λ‹Ή λ°°μ—΄μ—μ„œ κ΅ν™˜μ΄ μ΄λ£¨μ–΄μ§€λ―€λ‘œ O(N)이닀.

 

5. μž₯점 & 단점 πŸ₯Ώ

1. μž₯점

  • μ½”λ“œκ°€ λ§€μš° λ‹¨μˆœν•œλ‹€.
  • λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간을 ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€.

2. 단점

  • μ‹œκ°„λ³΅μž‘λ„κ°€ O(N^2)μ΄λ―€λ‘œ μƒλ‹Ήνžˆ λΉ„νš¨μœ¨μ μ΄λ‹€.
  • 정렬이 λ˜μ–΄μžˆλ”라도 λΉ„ꡐ μ—°μ‚°μ„ μˆ˜ν–‰ν•œλ‹€.

 

ν•΄λ‹Ή 글은 Gyoogleλ‹˜μ˜ κ±°ν’ˆ μ •λ ¬(Bubble Sort)을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.