import Foundation
func mergeSort(_ value: [Int]) -> [Int] {
guard value.count > 1 else { return value }
let mid = value.count / 2
let left = Array(value[0..<mid])
let right = Array(value[mid..<value.count])
return merge(mergeSort(left), mergeSort(right))
}
func merge(_ left: [Int], _ right: [Int]) -> [Int] {
var left = left
var right = right
var result = [Int]()
while !left.isEmpty && !right.isEmpty { // 둘 다 숫자를 가지고 있을 때
if left.first! < right.first! { // 더 작은 값을 순서대로 넣어준다.
result.append(left.removeFirst())
}else {
result.append(right.removeFirst())
}
}
result.append(contentsOf: left+right) // 남은 숫자들을 추가해준다.
return result
}
https://ko.wikipedia.org/wiki/%ED%95%A9%EB%B3%91_%EC%A0%95%EB%A0%AC
https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
https://babbab2.tistory.com/102
루트를 마지막 노드로 대체 (11 → 4), 다시 최대 힙 구성
func heapSort(_ value: [Int]) -> [Int] {
var result = value
for index in stride(from: result.count - 1, through: 0, by: -1) { // MaxHeap을 구성하기 위해서 루트(0) 값이 가장 커야하기 때문에 배열의 뒤에서(heap의 가장 아래부분)부터 반복시작
result = makeMaxHeap(result, index) // MaxHeap을 만들어줌
result.swapAt(0, index) // root 값이 가장 커야하기 때문에 가장 큰 값을 root로 이동
}
return result
}
func makeMaxHeap(_ value: [Int], _ maxIndex: Int) -> [Int] {
var result = value
for index in stride(from: maxIndex, to: 0, by: -1) { // 마찬가지로 밑에서부터 부모의 값보다 자식의 값이 크면 변경
if result[index] > result[index/2] {
result.swapAt(index, index/2)
}
}
return result
}
https://ko.wikipedia.org/wiki/%ED%9E%99_%EC%A0%95%EB%A0%AC
https://gmlwjd9405.github.io/2018/05/10/algorithm-heap-sort.html
https://sweetlog.netlify.app/algorithm/heap_sort/
func radixSort(_ value: [Int]) -> [Int] {
let radix = 10 // 0...9까지 숫자를 의미
var done = false // 언제까지 반복할 지(최대 자릿수)
var digits = 1 // 1의 자리
var result = value
while !done {
done = true // 첫 반복부터 완료가 됬다고 해주고, 내부에 존재하는 반복문에서 값을 변경
var buckets: [[Int]] = Array(repeating: [], count: radix) // 각 자릿수를 담을 버켓
for number in result {
let remainingPart = number / digits // 1의 자리 , 10의 자리 ...
let digit = remainingPart % radix // 각 자릿수의 index에 넣어주기 위해 나머지를 구한다.
buckets[digit].append(number) // 각 자릿수에 맞게 수를 할당
if remainingPart > 0 { // remainingPart이 모두 0이면 그 자릿수의 수가 없다고 판단 -> 정렬완료(반복문 종료)
done = false
}
}
digits *= radix // 다음 자릿수를 비교하기 위함
result = buckets.flatMap { $0 } // 버켓에 있는 수를 정렬해서 결과에 넣어줌
}
return result
}
https://lktprogrammer.tistory.com/48
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Algorithm/Sort_Radix.md
https://ko.wikipedia.org/wiki/%EA%B8%B0%EC%88%98_%EC%A0%95%EB%A0%AC
https://www.kodeco.com/51-data-structures-and-algorithms-in-swift-radix-sort