Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- apple intelligence
- ReactiveX
- RxSwift요약
- 자료구조
- 애플인텔리전스
- LLM
- swift알고리즘
- OperationQueue
- 백준
- CICD
- gitlab
- IOS
- 클린아키텍처
- rxswift
- Content Hugging priority
- 동시성프로그래밍
- CI/CD
- cleanarchitecture
- Union-Find
- gitlabci/cd
- RxCocoa
- swift
- mvvm
- Autolayout
- 알고리즘
- 동작과정
- 오토레이아웃
- ai expo
- Content Compression Resistance priority
- AI
Archives
- Today
- Total
JosephCha의 개발일지
병합정렬 본문
정의
- 정렬할 배열을 절반으로 잘라 비슷한 크기의 두 부분의 배열로 나눈다. (split)
- 각 부분 배열을 재귀적으로 합병 정렬을 이용해 정렬한다.
- 두 부분 배열을 다시 하나의 정렬된 배열로 합병한다.
// 병합정렬
func merge(left: [Int], right: [Int]) -> [Int]{
var merged = [Int]()
var leftPoint = 0
var rightPoint = 0
// case1 - left/right 둘다 있을때
while left.count > leftPoint && right.count > rightPoint {
if left[leftPoint] > right[rightPoint] {
merged.append(right[rightPoint])
rightPoint = rightPoint + 1
} else {
merged.append(left[leftPoint])
leftPoint = leftPoint + 1
}
}
// case2 - left 데이터가 없을 때
while left.count > leftPoint {
merged.append(left[leftPoint])
leftPoint = leftPoint + 1
}
// case3 - right 데이터가 없을 때
while right.count > rightPoint {
merged.append(right[rightPoint])
rightPoint = rightPoint + 1
}
return merged
}
func mergeSplit(dataArray: [Int]) -> [Int] {
if dataArray.count <= 1 {
return dataArray
}
let medium = dataArray.count / 2
let left = mergeSplit(dataArray: Array(dataArray[..<medium]))
let right = mergeSplit(dataArray: Array(dataArray[medium...]))
return merge(left: left, right: right)
}
print(mergeSplit(dataArray: [2,4,6,1,7,4,5,6,442,11]))
- 배열을 mergeSplit함수에서 재귀를 통해나눌 수 있을때까지 나눈다.
- 다 나눠지면 재귀 리턴으로 merge함수를 통해 합병정렬하면서 최종으로 정렬된 배열을 얻는다
'알고리즘 및 자료구조' 카테고리의 다른 글
스택 (0) | 2022.04.20 |
---|---|
이진탐색 (0) | 2022.04.20 |
동적 계획법(DP) (0) | 2022.02.24 |
선택정렬 (0) | 2021.12.08 |
삽입정렬 (0) | 2021.12.08 |
Comments