[Algorithm] μ½μ μ λ ¬(Insertion Sort) μ΄λ? (feat.Swift)
μλ νμΈμ 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)
}
}