๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
D.evelop [CS]/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ก ] ์ •๋ ฌ Sort - 2-2 ๋น„๊ต ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋ฒ„๋ธ” ์ •๋ ฌ)

by Danne 2024. 4. 22.

๐Ÿ’ก์˜ˆ์‹œ์— ๋Œ€ํ•œ ๊ฐ€์ •
- ์ž…๋ ฅ ํฌ๊ธฐ n
- ์ž…๋ ฅ ๋ฐฐ์—ด A[0…. n-1]
- ์ž…๋ ฅ ๋ฐ์ดํ„ฐ : ์–‘์˜ ์ •์ˆ˜
- ์ •๋ ฌ ๋ฐฉ์‹ : ์˜ค๋ฆ„์ฐจ์ˆœ (1, 2, 3, 4,…)

 

2-2) ๋ฒ„๋ธ” ์ •๋ ฌ (Bubble sort)

  • ๋ชจ๋“  ์ธ์ ‘ํ•œ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋กœ ๋น„๊ต ํ›„,
    ์™ผ์ชฝ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ์™€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์„ ๋ฐ˜๋ณต
  • ์ •๋ ฌ ๊ณผ์ • : ๋น„๊ต ์ง„ํ–‰ ๋ฐฉํ–ฅ →, ← ์— ๋”ฐ๋ผ ๋น„๊ต
    • ๋น„๊ต ์ง„ํ–‰ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์ •๋ ฌ ๊ณผ์ •์ด ๋‹ฌ๋ผ์ง 
      • ์™ผ → ์˜ค : ํฐ ๊ฐ’ ๋ถ€ํ„ฐ ์ฐพ์•„ ์˜ค๋ฅธ์ชฝ ๋ ๋ถ€ํ„ฐ ์œ„์น˜ (์˜ค๋ฅธ์ชฝ ๋๋ถ€ํ„ฐ ์ •๋ ฌ)
      …. < ์„ธ ๋ฒˆ์งธ๋กœ ํฐ< ๋‘๋ฒˆ์งธ๋กœ ํฐ < ๊ฐ€์žฅ ํฐ
      • ์™ผ ← ์˜ค: ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ฐพ์•„ ์™ผ์ชฝ ๋๋ถ€ํ„ฐ ์œ„์น˜ (์™ผ์ชฝ ๋๋ถ€ํ„ฐ ์ •๋ ฌ)
      ๊ฐ€์žฅ ์ž‘์€ < ๋‘ ๋ฒˆ์งธ๋กœ ์ž‘์€ < ์„ธ๋ฒˆ์งธ๋กœ ์ž‘์€ < …..

์™ผ์ชฝ → ์˜ค๋ฅธ์ชฝ

50๊ณผ 20์„ ๋น„๊ต
→ “50์ด 20๋ณด๋‹ค ํฌ๋‹ค
→ ๊ทธ๋Ÿผ 50์ด ์˜ค๋ฅธ์ชฝ!!

1๋‹จ๊ณ„์˜ ๋น„๊ต ํ›„ ๊ฒฐ๊ณผ : ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ
์™ผ์ชฝ ← ์˜ค๋ฅธ์ชฝ

10๊ณผ 40์„ ๋น„๊ต
→ “10์ด 40๋ณด๋‹ค ์ž‘๋‹ค
→ ๊ทธ๋Ÿผ 10์ด ์™ผ์ชฝ!!

1๋‹จ๊ณ„ ๋น„๊ตํ›„ ๊ฒฐ๊ณผ :๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ์™ผ์ชฝ

 


3. ํŠน์ง•

  • ์„ฑ๋Šฅ : O(n²)
  • ์ œ์ž๋ฆฌ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ž…๋ ฅ ๋ฐฐ์—ด A ์ด์™ธ ์ƒ์ˆ˜๊ฐœ(i, j, tmp) ์˜ ์ €์žฅ ๊ณต๊ฐ„๋งŒ ํ•„์š”
  • ์•ˆ์ •์  ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : [40, 40, 40] ์ด ์žˆ์œผ๋ฉด ์œ„์น˜๊ตํ™˜ ๋ฏธ๋ฐœ์ƒ
  • ์„ ํƒ ์ •๋ ฌ๋ณด๋‹ค ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ๋งŽ์ด ๋ฐœ์ƒ - ์„ ํƒ์ •๋ ฌ๋ณด๋‹ค ๋น„ํšจ์œจ์ 

 

[JS code]

function bubbleSort(A) {
    const n = A.length; 

    for (let i = 0; i < n - 1; i++) { // ๋‹จ๊ณ„ : (n-1)๋ฒˆ ๋ฐ˜๋ณต

        for (let j = 0; j < n - 1; j++) { // ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ
            if (A[j] > A[j + 1]) { // ‘์™ผ์ชฝ ๋ฐ์ดํ„ฐ > ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ’์ด๋ฉด

                // A[j]์™€ A[j+1]์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟˆ.  ์˜ˆ: [50, 10] -> [10, 50]
                let temp = A[j]; // A[j]๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅ
                A[j] = A[j + 1]; // A[j]์— A[j+1] ๊ฐ’์„ ๋Œ€์ž…
                A[j + 1] = temp; // A[j+1]์— ์ž„์‹œ๋กœ ์ €์žฅํ•œ ๊ฐ’์„ ๋Œ€์ž…
            }
        }

    }

    return A; // ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}

 

 

4. ๊ฐœ์„ ๋œ ๋ฒ„๋ธ” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

  • ๋ฃจํ”„์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ž„
    • 1๋ฒˆ์งธ ์กฐ๊ฑด ์ถ”๊ฐ€ :
      ์ž๋ฆฌ๋ฐ”๊ฟˆ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฏธ ์ •๋ ฌ ๋œ ์ƒํƒœ์ด๋ฉด, ์ดํ›„ ๋น„๊ต ์—†์ด ์ข…๋ฃŒ
    • 2๋ฒˆ ์งธ ์กฐ๊ฑด ์ถ”๊ฐ€ :
      ๋ฌด์กฐ๊ฑด ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ๋๊นŒ์ง€ ์ด๋™ํ•˜๋ฉฐ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ํ•„์š” ์—†์Œ
       for (j=0; j < (n-1) - i ; j++) 
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ : ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ 
    • ๊ธฐ์กด ๋ฒ„๋ธ” ์ •๋ ฌ, ๊ฐœ์„ ๋œ ๋ฒ„๋ธ”์ •๋ ฌ ๋‘˜ ๋‹ค O(n²)
  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ : ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์›ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ 
    • ๊ธฐ์กด ๋ฒ„๋ธ” ์ •๋ ฌ : ๋ชจ๋“  ๋‹จ๊ณ„ ์ˆ˜ํ–‰ = O(n²)
    • ๊ฐœ์„ ๋œ ๋ฒ„๋ธ” ์ •๋ ฌ : n๋ฒˆ ๋น„๊ต, ์ž๋ฆฌ๋ฐ”๊ฟˆ 0๋ฒˆ = O(n)

 

[JS code]

function advancedBubbleSort(A) {
    const n = A.length; 

    for (let i = 0; i < n - 1; i++) {
        let sorted = true; // ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๊ฐ€์ •

        for (let j = 0; j < n - 1 - i; j++) { // ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰
        
            if (A[j] > A[j + 1]) { // ๋งŒ์•ฝ A[j]๊ฐ€ A[j+1]๋ณด๋‹ค ํฌ๋‹ค๋ฉด
            
                // A[j]์™€ A[j+1]์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟˆ
                let temp = A[j]; 
                A[j] = A[j + 1]; 
                A[j + 1] = temp; 
                
                sorted = false; // ์ž๋ฆฌ๋ฐ”๊ฟˆ ๋ฐœ์ƒ → ์ „์ฒด์ ์œผ๋กœ ๋ฏธ์ •๋ ฌ ์ƒํƒœ
                
            }
        }
        
        if (sorted) break; // ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ์ข…๋ฃŒ
    }

    return A;
}

 

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€