관리 메뉴

Daehyunii's Dev-blog

07 버블 μ •λ ¬ λ³Έλ¬Έ

πŸ“š Language & CS knowledge/Algorithm & Data structure

07 버블 μ •λ ¬

Daehyunii 2022. 8. 6. 21:06

  μ§€κΈˆ λΆ€ν„°λŠ” 정렬에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•˜λ €κ³  ν•œλ‹€. μ •λ ¬μ΄λž€ 말 κ·ΈλŒ€λ‘œ 데이터λ₯Ό μΌμ •ν•œ 기쀀을 가지고 μž¬λ°°μ—΄ν•˜λŠ” 과정을 λ§ν•œλ‹€. 정렬을 ν•˜λŠ” λ°©μ‹μ—λŠ” λ§Žμ€ 방법이 μ‘΄μž¬ν•˜κ³  각각의 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜λ§ˆλ‹€ μž₯/단점을 μ§€λ‹ˆκ³  μžˆλ‹€. λ˜ν•œ 정렬을 ν•  수 μžˆλŠ” λ§Žμ€ λ©”μ„œλ“œλ“€μ΄ μ‘΄μž¬ν•œλ‹€. κ·ΈλŸ¬ν•œ λ©”μ„œλ“œλ“€μ„ 잘 ν™œμš©ν•˜λŠ”κ²ƒλ„ μ€‘μš”ν•˜κ² μ§€λ§Œ, κ·Έ λ™μž‘ 원리λ₯Ό μ•„λŠ”κ²ƒ λ˜ν•œ ꡉμž₯히 μ€‘μš”ν•œ 일이닀. 

 

λŒ€ν‘œμ μ΄κ³  일반적인 μ •λ ¬ 방식이 버블 μ •λ ¬, 선택 μ •λ ¬, μ‚½μž… 정렬이 있고 κ·Έ λ’€λ‘œ νš¨μœ¨μ„±μ„ κ°œμ„ μ‹œν‚¨ μ •λ ¬ 방식듀이 μžˆλ‹€. 버블 μ •λ ¬, 선택 μ •λ ¬, μ‚½μž… 정렬은 νš¨μœ¨μ„±μ΄ λ–¨μ–΄μ Έ 잘 μ‚¬μš©λ˜μ§€λŠ” μ•Šμ§€λ§Œ νŠΉμ • μƒν™©μ—μ„œλŠ” μœ μš©ν•œ 정렬방식일 수 μžˆλ‹€.

 

7.1 버블 μ •λ ¬ : κ°œμš”

  버블 정렬은 ν”νžˆ μ‚¬μš©λ˜μ§€λŠ” μ•ŠλŠ”λ‹€. λ‹€λ₯Έ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ— λΉ„ν•΄ λΉ„νš¨μœ¨μ μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ λ‹€λ₯Έ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜κ³Ό λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•Œμ•„ λ‘˜ ν•„μš”κ°€ μžˆλ‹€. 버블 μ •λ ¬μ˜ μž‘λ™ 방식은 루프λ₯Ό λŒλ©΄μ„œ 각 μš”μ†Œλ₯Ό ν•΄λ‹Ή μš”μ†Œμ™€ κ·Έ λ‹€μŒ μš”μ†Œμ™€ λΉ„κ΅ν•˜μ—¬ μŠ€μ™‘ν•˜λŠ” 것이닀. 예λ₯Ό λ“€μ–΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€λ©΄, ν•΄λ‹Ή μš”μ†Œκ°€ λ‹€μŒ μš”μ†Œλ³΄λ‹€ 값이 크닀면 ν•΄λ‹Ή μš”μ†Œμ™€ λ‹€μŒ μš”μ†Œλ₯Ό κ΅ν™˜ν•΄ μ£ΌλŠ” 것이닀. 

 

  κ²°κ΅­ λ£¨ν”„μ˜ ν•œ 바퀴가 λŒλ•Œλ§ˆλ‹€ κ°€μž₯ 큰 μš”μ†Œκ°€ κ°€μž₯ 였λ₯Έμͺ½μ— μ •λ ¬λ˜κ²Œ 될 것이닀. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 루프가 ν•œ 바퀴 λŒλ•Œλ§ˆλ‹€ κ°€μž₯ 큰 μš”μ†Œκ°€ κ°€μž₯ 였λ₯Έμͺ½μ— μ •λ ¬λ˜κΈ° λ•Œλ¬Έμ— κ·Έ λ‹€μŒ 루프가 λŒμ•„κ°ˆλ•ŒλŠ” κ°€μž₯ 였λ₯Έμͺ½μ— μžˆλŠ” μš”μ†ŒλŠ” μ œμ™Έν•˜κ³  λ‚˜λ¨Έμ§€λ₯Ό 비ꡐ해야 ν•œλ‹€. 즉, λ°˜λ³΅μ„ κ±°λ“­ν• λ•Œλ§ˆλ‹€ μ •λ ¬ν•΄μ•Ό ν•˜λŠ” μš”μ†Œμˆ˜λŠ” μ€„μ–΄λ“ λ‹€λŠ” 것이닀!!

 

  μš°μ„  버블 정렬을 κ΅¬ν˜„ν•˜κΈ° 전에 μš”μ†Œλ₯Ό μŠ€μ™‘ν•˜λŠ” 방법뢀터 μ•Œμ•„μ•Ό ν•œλ‹€.

ES5(가독성이 μ’‹μŒ)
function swap(arr, idx1, idx2) {
  var temp = arr[idx1];
  arr[idx1] = arr[idx2]; // λ°°μ—΄ μš”μ†Œ κ°±μ‹ 
  arr[idx2] = temp; // λ°°μ—΄ μš”μ†Œ κ°±μ‹ 
}

ES6(가독성은 λ–¨μ–΄μ§€μ§€λ§Œ, μ½”λ“œκ°€ 짧음)
const swap = (arr, idx1, idx2) => {
  [arr[idx1],arr[idx2]] = [arr[idx2],arr[idx1]];
}

 

  μš”μ†Œλ₯Ό μŠ€μ™‘ν•˜λŠ” 방법은 κ·Έλ ‡κ²Œ 어렡지가 μ•Šλ‹€. 말 κ·ΈλŒ€λ‘œ ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό 미리 λ³€μˆ˜μ— 담아놓고 ν•˜λ‚˜μ˜ μš”μ†Œμ— λ‹€λ₯Έ μš”μ†Œλ₯Ό ν• λ‹Ήν•΄μ£Όκ³  λ‚˜λ¨Έμ§€ μš”μ†Œμ— λ³€μˆ˜μ— 미리 담아놓은 μš”μ†Œλ₯Ό ν• λ‹Ήν•΄ μ£Όλ©΄ λœλ‹€. ES5와 ES6μ½”λ“œ λ‘˜ λ‹€ 같은 μ˜λ―Έμ΄μ§€λ§Œ ν‘œν˜„μ΄ 쑰금 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 더 νŽΈλ¦¬ν•œ 방법을 μ‚¬μš©ν•˜λ©΄ 될 것 κ°™λ‹€.

 

μ˜μ‚¬μ½”λ“œ(κ°•μ‚¬λ‹˜μ΄ λ§Œλ“€μ–΄μ£Όμ‹¬)

1. ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ 배열을 인수둜 λ°›κ³  λ°°μ—΄μ˜ μš”μ†Œλ“€μ€ 숫자라고 κ°€μ •ν•œλ‹€.

2. iλΌλŠ” λ³€μˆ˜λ₯Ό λ§Œλ“€κ³  λ°°μ—΄μ˜ 맨 λμ—μ„œ 루프λ₯Ό μ‹œμž‘ν•˜μ—¬ 맨 μ•žμ—μ„œ 끝낸닀.

3. 루프 μ•ˆμ—λŠ” 쀑첩 루프가 있고 jλ₯Ό λ³€μˆ˜λ‘œ λ§Œλ“€κ³ , λ‚΄λΆ€ λ£¨ν”„λŠ” μ²˜μŒλΆ€ν„° i-1κΉŒμ§€ λ°˜λ³΅λœλ‹€.

4. arr[j]κ°€ arr[j+1]보닀 크닀면 두 값을 μŠ€μ™‘ν•œλ‹€.

5. 그리고 arr을 λ°˜ν™˜ν•œλ‹€.

 

7.2 버블 μ •λ ¬ : κ΅¬ν˜„

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

  iλ₯Ό λμ—μ„œλΆ€ν„° μ‹œμž‘ν•΄μ„œ λ°˜λ³΅μ„ ν•˜λŠ” μ΄μœ λŠ” κ°€μž₯ 루프가 ν•œ 바퀴 λŒλ•Œλ§ˆλ‹€ κ°€μž₯ 였λ₯Έμͺ½μ—λŠ” κ°€μž₯ 큰 μš”μ†Œ 값이 정렬이 λ˜μ–΄ 있기 λ•Œλ¬Έμ— 더 이상 비ꡐ ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μš”μ†Œλ₯Ό μ œμ™Έν•˜κ³  λΉ„κ΅ν•˜κΈ° μœ„ν•΄ iλ₯Ό λμ—μ„œ λΆ€ν„° λ°˜λ³΅μ‹œν‚€λŠ” 것이닀. 

 

7.2 버블 μ •λ ¬ : μ΅œμ ν™”

  버블 정렬을 ν–ˆμ„λ•Œ μœ„μ˜ μ½”λ“œμ˜ λ¬Έμ œμ μ€ λ§Œμ•½ 배열이 정렬이 λŒ€λΆ€λΆ„ 이뀄져 있고 μΌλΆ€λΆ„λ§Œ 정렬이 λ˜μ–΄ μžˆμ§€ μ•Šλ‹€κ³  μƒκ°ν•΄λ³΄μž. 그런 κ²½μš°μ—λ„ μŠ€μ™‘μ΄ μΌμ–΄λ‚˜μ§€ μ•Šμ„λΏ λ°˜λ³΅μ€ κ³„μ†ν•΄μ„œ 일어날것이닀. μ΄λŠ” λΉ„νš¨μœ¨μ μ΄λŠ” 이λ₯Ό ν•΄κ²°ν•˜κΈ° 루프가 λ˜λŠ” 와쀑에 단 ν•œ λ²ˆμ΄λΌλ„ μŠ€μ™‘μ΄ μΌμ–΄λ‚˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ°˜λ³΅μ„ κ·Έλ§Œλ‘λŠ” 쑰건을 달면 λ˜λŠ” 것이닀. 반볡이 단 ν•œ λ²ˆλ„ μΌμ–΄λ‚˜μ§€ μ•Šμ•˜λ‹€λŠ” 것은 λ°˜λŒ€λ‘œ λ§ν•˜λ©΄ 더 이상 μŠ€μ™‘ν•  μš”μ†Œκ°€ μ—†λŠ”κ²ƒμ΄κ³  정렬이 μ™„λ£Œλ˜μ–΄ μžˆλ‹€λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€.

function bubbleSort(arr){
    let noSwap;

    for(var i = arr.length; i > 0; i--){
        noSwap = true; // μ΅œμ ν™”λ₯Ό μœ„ν•΄ 비ꡐ해야 ν•  μš”μ†Œμ˜ 개수λ₯Ό ν•˜λ‚˜μ”© μ€„μ—¬λ‚˜κ°
        for(var j = 0; j < i - 1; j++){ // μ•žμ—μ„œ λΆ€ν„° ν•΄λ‹Ήμš”μ†Œμ™€ κ·Έ λ‹€μŒ μš”μ†Œλ₯Ό λΉ„κ΅ν•΄μ„œ μŠ€μ™‘
            if(arr[j] > arr[j+1]){
                var temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                noSwap = false;         
            }
        }
        if(noSwap) break; // 즉 ν•œλ°”ν€΄ μ­‰ λŒμ•˜λŠ”λ°, κ΅ν™˜μ΄ μΌμ–΄λ‚˜μ§€ μ•ŠμœΌλ©΄ κ·ΈλŒ€λ‘œ true일 것이고, 그럼 더 이상
        //λ°”κΏ€κ²Œ μ—†λŠ” κ±°λ‹ˆκΉŒ 전체 λ°˜λ³΅μ„ μ’…λ£Œν•¨!!!
    }
    return arr;
}

  참고둜, μŠ€μ™‘λ¬Έμ„ ES6의 λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•΄λ„ 상관없닀. 개인적으둜 μ½”λ“œ 쀄 μˆ˜λ„ 크게 차이가 λ‚˜μ§€ μ•Šκ³ , ES5μ—μ„œμ˜ μŠ€μ™‘λ°©μ‹μ΄ κ³΅λΆ€ν•˜λŠ” μž…μž₯μ—μ„œ 쑰금 더 직관적이라 ES5방식을 μ΄μš©ν•˜μ—¬ μŠ€μ™‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.

 

  

'πŸ“š Language & CS knowledge > Algorithm & Data structure' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

09 μ‚½μž… μ •λ ¬  (0) 2022.08.07
08 선택 μ •λ ¬  (0) 2022.08.07
06 검색 μ•Œκ³ λ¦¬μ¦˜  (0) 2022.08.05
05 μž¬κ·€  (0) 2022.08.04
04 문제 ν•΄κ²° νŒ¨ν„΄  (0) 2022.08.04