본문 바로가기

알고리즘/알고리즘&자료구조16

Heap 힙 자료구조 ㅎ..제가 말이죠.. 요즘 Swift로 알고리즘을 풀어보려고 연습중인데, 거의 없는게 없는 Java로 알고리즘 문제를 풀다가 Swift로 풀려고 하니 없는게 너어무 많더라구요??? Stack도 Queue도 PriorityQueue도?!? 구글링 해보니 직접구현해야하는 거 같더라구요??ㅋㅋㅋㅋㅋ 예. 근데 이것도 사실 이 게시물 작성했을 당시에 iOS / Swift 공부를 한지 겨우 2개월밖에 안됐을 때라 그랬나봐용.. stack 은 그냥 배열에서 removeLast( ) 사용해서 stack처럼 사용하면 되구.. queue는 그냥 배열에서 removeFirst( ), removeLast( ) 사용해서 queue처럼 사용하면 되구.. PriorityQueue도 .sorted(by: { Bool }) 이런식으.. 2021. 2. 17.
Insertion Sort (삽입 정렬) Insertion Sort (삽입 정렬)은 이름 그대로 적절한 위치에 삽입을 하여 정렬을 하는 알고리즘입니다. 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 하나씩 비교하여 자신의 위치를 찾아 삽입함으로써 정렬을 완성합니다. 요소를 하나씩 비교해나가기 때문에 시간 복잡도는 O(n^2)를 가집니다. 알고리즘 구현 순서는 다음과 같습니다. 비교는 배열의 두 번째 인덱스부터 시작하여 자신의 앞쪽에 있는 요소들과 비교합니다. 비교했을 때, 앞의 요소가 자신보다 크다면 swap 합니다. 비교했을 때, 앞의 요소가 자신보다 작다면 비교를 멈춥니다. 다음 인덱스의 요소부터 다시 2~4를 반복합니다. 아래는 Swift로 구현한 Insertion Sort 입니다. var arr: [Int] = [5,2,4,1.. 2021. 2. 15.
Quick Sort (퀵 소트) Quick Sort는 전형적인 분할 정복(divide and conquer) 알고리즘의 하나입니다. 이름만큼 평균적으로 매우 빠른 수행 속도를 자랑하며 시간복잡도 O(n log n)을 가지고, 추가 메모리 공간을 필요로 하지 않기 때문에 O(log n)만큼의 메모리를 필요로 합니다. Merge Sort와 달리 Quick Sort는 비균등 분할을 합니다. 리스트 안에 있는 한 요소를 선택하는데, 이때 이 원소를 pivot이라 합니다. 입력 배열을 pivot을 기준으로 비균등하게 2개의 부분 배열로 분할합니다. 이 때, pivot의 왼쪽은 pivot보다 작은 요소들로, pivot의 오른쪽은 pivot보다 큰 요소로 이루어지게 됩니다. (divide) 이렇게 분할한 부분 배열을 정렬합니다. 부분 배열의 크기가.. 2021. 2. 12.
Merge Sort (병합 정렬) Merge Sort는 전형적인 분할 정복(divide and conquer) 알고리즘의 하나입니다. 시간복잡도 O(n^2)을 가지는 일반적인 정렬과 달리 Merge Sort의 시간 복잡도는 O(nlog_2 n) 이 됩니다. 이등분씩 나누는 것을 반복해서 최소 단위까지 분할합니다. (divide) 분할한 부분 리스트를 정렬합니다. (conquer) 정렬된 부분 리스트들을 하나의 리스트에 병합합니다. (combine) 다음은 swift 언어로 구현한 divide, merge 메서드 입니다. func divide(_ start: Int,_ end: Int) { if start >= end { return } let mid = (start + end) / 2 divide(start, mid) divide(mid.. 2021. 2. 11.