μ½”λ”© ν…ŒμŠ€νŠΈ/μ•Œκ³ λ¦¬μ¦˜

JavaScript둜 μ•Œμ•„λ³΄λŠ” 버블 μ •λ ¬(Bubble Sort)κ³Ό 예제 μ½”λ“œ

μš©λ‡½ 2023. 10. 11. 20:53
λ°˜μ‘ν˜•

https://www.resultswebdev.com/bubble-sort-algorithm/

μ†Œκ°œ

버블 μ •λ ¬(Bubble Sort)은 κ°€μž₯ κ°„λ‹¨ν•˜κ³  기본적인 μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ‘œ, μ΄λ¦„μ—μ„œλ„ μ•Œ 수 μžˆλ“―μ΄ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό 'κ±°ν’ˆ(Bubble)'처럼 μ„œλ‘œ κ΅ν™˜ν•΄ κ°€λ©° μ •λ ¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

즉, μ„œλ‘œ μΈμ ‘ν•œ 두 μ›μ†Œλ₯Ό 비ꡐ해가며 μ˜€λ¦„μ°¨μˆœμ΄λ‚˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 정을 μ§„ν–‰ν•©λ‹ˆλ‹€.

κΈ°λ³Έ κ°œλ…

버블 μ •λ ¬μ˜ κ°œλ…μ€ λ§Œμ•½ 숫자 배열을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λŠ” μƒν™©μ—μ„œ 더 큰 μˆ«μžκ°€ ν•œ λ²ˆμ— ν•˜λ‚˜μ”© λ’€λ‘œ μ΄λ™ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

기본적으둜 μ–΄λ–€ ν•­λͺ©μ΄ 더 크면 κ΅ν™˜ν•˜κ³ , λ‹€μŒ ν•­λͺ©κ³Ό λΉ„κ΅ν•˜κ³ , λ‹€μŒ ν•­λͺ©λ³΄λ‹€ 더 크면 또 κ΅ν™˜μ„ ν•˜κ³ , λ‹€μ‹œ λ‹€μŒ ν•­λͺ©κ³Ό λΉ„κ΅ν•˜λ©΄μ„œ λ°˜λ³΅μ„ ν•©λ‹ˆλ‹€.

μ˜€λ¦„μ°¨μˆœμ˜ μƒν™©μ—μ„œλŠ” κ°€μž₯ 큰 값이 상단을 ν–₯ν•΄μ„œ 값을 μ •λ ¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ λͺ©λ‘μ„ λ§Œλ“­λ‹ˆλ‹€.

예제 μ½”λ“œ #1

function bubbleSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

기본적인 버블 μ •λ ¬ μ½”λ“œμž…λ‹ˆλ‹€.

ν•΄λ‹Ή μ½”λ“œλŠ” 이쀑 λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ μΈμ ‘ν•œ μ›μ†Œμ— λŒ€ν•΄μ„œ 크기λ₯Ό λΉ„κ΅ν•˜λ©° μœ„μΉ˜λ₯Ό λ°”κΎΈλ©΄μ„œ 정렬을 μ§„ν–‰ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ 이 μ½”λ“œλŠ” 이미 정렬이 된 μƒνƒœμ—μ„œλŠ” 버블 정렬이 μž‘λ™ν•˜λŠ” 원리 λ•Œλ¬Έμ— 끝 뢀뢄에 indexκ°€ μ—†λŠ” κ³³κ³Ό λΉ„κ΅ν•΄μ„œ undifined와 λ¬΄μ˜λ―Έν•œ 비ꡐλ₯Ό ν•˜κ³ , 이미 정렬이 된 μƒνƒœμ—μ„œλ„ λΆˆν•„μš”ν•œ 연산을 ν•˜ λ°˜λ³΅λ¬Έμ„ 돌게 λ©λ‹ˆλ‹€.

 

즉, j < arr.length 쑰건 λ•Œλ¬Έμ— arr[j + 1]κ°€ λ°°μ—΄ λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” κ²½μš°κ°€ μƒκΉλ‹ˆλ‹€.

κ·Έλž˜μ„œ λ§ˆμ§€λ§‰ μš”μ†Œμ™€ undefinedλ₯Ό λΉ„κ΅ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 되면 λΆˆν•„μš”ν•œ 연산을 μˆ˜ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ΅œμ ν™”λœ μ½”λ“œ

function bubbleSort(arr) {
  let noSwaps;
  for (let i = arr.length; i > 0; i--) {
    noSwaps = true;
    for (let j = 0; j < i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        noSwaps = false;
      }
    }
    if (noSwaps) break;
  }
  return arr;
}

j < arr.length - i - 1둜 λ§ˆμ§€λ§‰ μš”μ†Œμ™€ undefinedλ₯Ό λΉ„κ΅ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

그리고 첫번째 예제 μ½”λ“œμ—μ„œλŠ” 이미 정렬이 된 μƒνƒœμ—μ„œλ„ 반볡문이 λŒλ©΄μ„œ 연산을 μˆ˜ν–‰ν•˜μ§€λ§Œ ν•΄λ‹Ή μ½”λ“œλŠ” 반볡문이 μ§„ν–‰λ˜λ©΄μ„œ κ΅ν™˜ μž‘μ—…μ΄ μ—†λ‹€λ©΄ 배열은 이미 μ •λ ¬λœ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜κ²Œ λ©λ‹ˆλ‹€.

 

λ”°λΌμ„œ, 배열이 거의 μ •λ ¬λœ μƒνƒœλΌλ©΄ λ°°μ—΄μ˜ 길이가 길어짐에 따라 μ „ μ½”λ“œμ™€λŠ” μ•„μ£Ό 큰 차이가 μƒκΉλ‹ˆλ‹€.

버블 μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„(Big O)

λ°°μ—΄μ˜ 각 ν•­λͺ©λ§ˆλ‹€ n번의 비ꡐλ₯Ό ν•˜κ³  λ°°μ—΄μ˜ λ‹€λ₯Έ λͺ¨λ“  ν•­λͺ© ν•˜λ‚˜ν•˜λ‚˜ λΉ„κ΅ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 버블 μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^2)μž…λ‹ˆλ‹€.

 

κ·ΈλŸ¬λ‚˜ λ°μ΄ν„°κ°€ κ±°μ˜ μ •λ ¬λ˜μ—ˆκ±°λ‚˜ μ΄λ―Έ μ •λ ¬μ΄ μ™„λ£Œλœ μƒνƒœμ—μ„œ noSwaps λ³€μˆ˜κ°€ μžˆλŠ” μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ„ ν˜• μ‹œκ°„(Linear Time)에 κ°€κΉŒμ›Œμ§‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, [1, 2, 3, 4, 5]와 같은 이미 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ λ°°μ—΄μ—μ„œλŠ” 첫 번째 패슀 λ™μ•ˆ μ–΄λ– ν•œ κ΅ν™˜λ„ λ°œμƒν•˜μ§€ μ•Šμ•„ μ•Œκ³ λ¦¬μ¦˜μ΄ μ¦‰μ‹œ μ’…λ£Œλ©λ‹ˆλ‹€.

λ”°λΌμ„œ 이 경우 λ²„λΈ”μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)으둜 μ€„μ–΄λ“€κ²Œ λ©λ‹ˆλ‹€.

λ‹€λ§Œ μ£Όλͺ©ν•΄μ•Ό ν•  μ μ€ μ΄λŸ¬ν•œ μ΅œμ ν™” μ‚¬ν•­λ“€μ€ 'μ΅œμ„ '의 κ²½μš°μ— ν•΄λ‹Ήν•˜λ©° μΌλ°˜μ μΈ μƒν™©μ—μ„œ λ²„블정렬은 μ—¬μ „νžˆ O(N^2)의 μ‹œκ°„ λ³΅μž‘도λ₯Ό κ°€μ§„λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ°˜μ‘ν˜•