πŸ–₯ Computer Science/Algorithm

[Algorithm] μ‚½μž… μ •λ ¬(Insertion Sort) μ΄λž€? (feat.Swift)

Fomagran πŸ’» 2021. 9. 28. 14:16
728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš” FomaπŸ’»  μž…λ‹ˆλ‹€!

 

μ˜€λŠ˜μ€ 학ꡐ μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—…μ„ λ“£λŠ” 쀑에 μ‚½μž… 정렬을 κ΅¬ν˜„ν•΄λ³΄λŠ” κ³Όμ œκ°€ μžˆμ—ˆλŠ”λ°... 

 

λ”± 이 방식이 μ–΄λ–€ 것이고 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€! 라고 ꡬ체적으둜 λ– μ˜€λ₯΄μ§€κ°€ μ•Šλ”λΌκ΅¬μš”... 

 

κ·Έλž˜μ„œ μ‚½μž… 정렬이 무엇이고 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•΄ 정리해보렀고 ν•©λ‹ˆλ‹€!

 

λ°”λ‘œ μ‹œμž‘ν• κ²Œμš”~


μ‚½μž… μ •λ ¬μ΄λž€?

 

μ‚½μž… 정렬은 자료 λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ•žμ—μ„œλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 이미 μ •λ ¬λœ λ°°μ—΄ λΆ€λΆ„κ³Ό λΉ„κ΅ν•˜μ—¬, μžμ‹ μ˜ μœ„μΉ˜λ₯Ό μ°Ύμ•„ μ‚½μž…ν•¨μœΌλ‘œμ¨ 정렬을 μ™„μ„±ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. -μœ„ν‚€ λ°±κ³Ό -

 

μ •λ ¬ν•˜λŠ” 과정을 μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

좜처: μœ„ν‚€λ°±κ³Ό

 

μ‚½μž… μ •λ ¬ κ³Όμ •

 

82,10,9,72,31,45,60λ₯Ό μ‚½μž… 정렬을 ν•˜λŠ” 과정은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

1. λ¨Όμ € 맨 첫 번째인 82와 κ·Έ λ‹€μŒ 숫자인 10을 λΉ„κ΅ν•΄μ€λ‹ˆλ‹€. 

 

10이 더 μž‘μœΌλ―€λ‘œ 82 μ•žμœΌλ‘œ λ³΄λƒ…λ‹ˆλ‹€. <- 10 82

 

2. 10 λ‹€μŒ 숫자인 9와 10 82λ₯Ό λΉ„κ΅ν•΄μ€λ‹ˆλ‹€.

 

9λŠ” 10,82보닀 μž‘μœΌλ―€λ‘œ κ°€μž₯ μ•žμœΌλ‘œ λ³΄λƒ…λ‹ˆλ‹€ <- 9 10 82

 

3. κ·Έ λ‹€μŒ 숫자인 72와 이전 μˆ«μžλ“€μ„ λΉ„κ΅ν•΄μ€λ‹ˆλ‹€.

 

72λŠ” 82보닀 μž‘κ³  10보닀 ν¬λ―€λ‘œ 10 λ°”λ‘œ λ’€λ‘œ λ³΄λ‚΄μ€λ‹ˆλ‹€. <- 9 10 72 82

 

4. 31κ³Ό 이전 μˆ«μžλ“€μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

 

31은 72보닀 μž‘κ³  10보닀 ν¬λ―€λ‘œ 10 λ°”λ‘œ λ’€λ‘œ λ³΄λ‚΄μ€λ‹ˆλ‹€. <- 9 10 31 72 82

 

5. 45와 이전 μˆ«μžλ“€μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

 

45λŠ” 31보닀 크고 72보닀 μž‘μœΌλ―€λ‘œ 31 λ’€λ‘œ λ³΄λ‚΄μ€λ‹ˆλ‹€. <- 9 10 31 45 72 82

 

6. λ§ˆμ§€λ§‰μœΌλ‘œ 60κ³Ό 이전 μˆ«μžλ“€μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

 

60은 45보닀 크고 72보닀 μž‘μœΌλ―€λ‘œ 45 λ’€λ‘œ λ³΄λ‚΄μ€λ‹ˆλ‹€. <- 9 10 31 45 60 72 82

 

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

 

λ§Œμ•½ n개의 데이터가 μžˆλ‹€λ©΄, μ΅œμ•…μ˜ 경우 μ²˜μŒλΆ€ν„° λκΉŒμ§€ 1 + 2 + 3 + 4 ... n-1κΉŒμ§€ 비ꡐλ₯Ό ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—

 

μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n²)μž…λ‹ˆλ‹€.

 

 


μ½”λ“œ κ΅¬ν˜„

 

import Foundation

var numbers = [82,10,9,72,31,45,60]

numbers.sortByInsertion(nil)

extension Array where Element == Int {
    mutating func sortByInsertion(_ startIndex:Int?) -> [Int] {
        let start = startIndex == nil ? 1 : startIndex!
        if start == self.count { return self }
        
        let current = self.remove(at: start)
        var index = 0
        for i in stride(from: start-1, through: 0, by:-1) {
            if current >= self[i] {
                index = i+1
                break
            }
        }
        self.insert(current, at:index)
        return sortByInsertion(start+1)
    }
}
728x90
λ°˜μ‘ν˜•