병합 정렬 은근 어렵더라구용 헤헤
Swift로 된 풀이도 많이 없구 😰
그래서 포스트로 정리해보려합니당
분할 정복 알고리즘의 하나로,
배열을 두 개로 분할 하여 정렬한 후 이를 합치는 알고리즘이다.
그래서 병합정렬 알고리즘의 프로세스는
으로 진행된다.
이때 정복하는 과정에서 나눠진 배열이 충분히 작지 않은 경우 또다시 분할, 정복 과정을 진행하게 되는데 이는 재귀함수로 구현한다.
병합정렬의 프로세스를 이미지로 보면 다음과 같다
이 과정을 여기 에서 더 자세히 볼 수 있다.
var numArray = [Int]()
func mergeSort(_ array: [Int], _ start: Int, _ end: Int) {
if array.count <= 1 { return }
if start < end {
let center = (start + end) / 2
mergeSort(array, start, center)
mergeSort(array, center + 1, end)
merge(start, center, end)
}
}
func merge(_ start: Int, _ center: Int, _ end: Int) {
var i = start
var j = center + 1
var t = 0
var sortedArray = [Int]()
while i <= center && j <= end {
if numArray[i] <= numArray[j] {
sortedArray.append(numArray[i]
i += 1
} else {
sortedArray.append(numArray[j]
j += 1
}
}
while i <= center {
sortedArray.append(numArray[i])
i += 1
}
while j <= end {
sortedArray.append(numArray[j]
j += 1
}
i = start
while i <= end {
numArray[i] = sortedArray[t]
i += 1
t += 1
}
}
let input = readLine()!.split(separator:" ").map{Int(String($0))!}
let (N, K) = (input[0], input[1])
var numArray = readLine()!.split(separator:" ").map{Int(String($0))!}
var count = 0
var answer = -1
func mergeSort(_ array: [Int], _ start: Int, _ end: Int) {
if array.count <= 1 { return }
if start < end && count < K {
let center = (start + end) / 2
mergeSort(array, start, center)
mergeSort(array, center + 1, end)
merge(start, center, end)
}
}
func merge(_ start: Int, _ center: Int, _ end: Int) {
var i = start
var j = center + 1
var t = 0
var temp = [Int]()
while i <= center && j <= end {
if numArray[i] <= numArray[j] {
temp.append(numArray[i])
i += 1
} else {
temp.append(numArray[j])
j += 1
}
}
while i <= center {
temp.append(numArray[i])
i += 1
}
while j <= end {
temp.append(numArray[j])
j += 1
}
i = start
while i <= end {
numArray[i] = temp[t]
count += 1
if count == K {
answer = temp[t]
break
}
i += 1
t += 1
}
}
mergeSort(numArray, 0, N - 1)
print(answer)
https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
https://algorithm-visualizer.org/divide-and-conquer/merge-sort