본문 바로가기

정렬알고리즘4

Merge Sort - 합병 정렬과 코드 병합정렬이라고도 하고 합병정렬이라고도 한다. 합병정렬은 퀵소트와 비슷하면서도 2배의 메모리 공간을 차지한다. 하지만 최선/평균/최악의 경우 시간복잡도가 모두 O(NlogN)으로 같다. 합병정렬은 1. 영역 나누기 2. 각 영역을 Merge Sort 3. 두개의 영역을 Merge 하는 순으로 진행된다. 간단한 예를 그림과 함께 보면 다음과 같다. 배열을 쪼갤 수 있을 때까지 쪼갠후 합친다. 합칠 때는 값을 비교하면서 순서를 맞춰 합친다. 의사코드를 작성해보면 다음과 같다. MergeSort(start, end, arr[], tmp[]){ if(start >= end) return; //분리 mid = (start + end)/2; //합병정렬 MergeSort(start, mid, arr); MergeSo.. 2022. 7. 7.
Quick Sort - 퀵 정렬과 코드 앞서 다른 정렬들은 영어부분을 번역해서 "ㅁㅁ정렬" 이렇게 부르던데 퀵소트는 그냥 퀵정렬이라고 부르는부분이 약간 웃기다. 퀵정렬은 분할 정복을 사용한다. 1. 배열의 끝에 있는 수를 Pivot으로 설정한다. (기준값) 그리고 맨 처음에 Pivot보다 작은 수를 세기위한 low와 (오름차순) 차례 차례 수를 확인하고 비교하기위한 ptr 을 둔다. 2. ptr에 있는 값과 Pivot값을 비교한다. 오름차순의 경우 ptr값이 더 작으면 low값을 뒤로 한칸 옮긴다. (++ 그리고 이때 만약 ptr값과 low값이 다르면 두 값을 Swap한다) 비교가 끝나면 ptr을 한 칸 뒤로 옮긴다. 3. 계속해서 ptr과 Pivot값을 비교한다. ptr에 있는 값이 더 크다면 low는 그대로 두고 ptr을 뒤로 옮긴다. .. 2022. 7. 6.
Insertion Sort - 삽입 정렬과 코드 삽입 정렬은 정렬하려는 배열의 두 번째 원소부터 확인한다. 선택된 원소에서 앞과 비교해서 오름차순의 경우 앞의 원소가 더 크면 선택된 원소와 자리를 교환한다. 위 그림에서 파란 화살표가 가리키는 게 Key라고해보자. 두번째부터 시작해서 앞과 비교한다. 비교와 바꾸기가 끝나면 다음 반복에서 Key가 한칸 뒤로 옮겨진다. 이에 대해서 의사코드를 작성해보면 다음과 같다. for ( i = 1 ; i 0; j--){ if(key < arr[i-1]) arr[j] = arr[i-1] else break; } arr[j] = key } 바깥 반복문은 2번째 원소부터 끝까지 돌고 안쪽 반복문은 바깥 반복문의 앞쪽을 돈다. 앞쪽을 돌다가 key값보.. 2022. 7. 6.
[알고리즘] 병합정렬 알고리즘 | Merge Sort | C++코드 해석 분할정복(Divide and Conquer) 알고리즘을 공부하고있습니다. 병합정렬을 이해해보겠습니다, 우선은 코드는 이렇게 생겼습니다 코드를 이해하기 쉽도록 병합정렬의 개념과 예시그림을 설명하겠습니다! 병합정렬은 분할과 정렬로 나눌수있습니다. 먼저 처음과 끝의 중간에서 두 개로 분할합니다. 이후 분할된 블록들을 계속해서 최소단위까지 분할해줍니다. 8개의 수열을 분할하는 과정을 예로 들면, 이런 식이 됩니다. 코드를 보면 이에 재귀함수를 이용하였는데요, 빨간색 숫자는 재귀함수에 따라 분할이 되는 순서입니다. 재귀함수가 머리아프신분들은 저 순서를 보시면 직관적으로 바로 이해가 되실 거에요! 분할이 끝났으면 5번에서 정렬&병합 한번, 8번에서 한번, 8번 병합이끝나고 6번에 돌아와서 한번, 6번에서 끝나고 2.. 2020. 2. 20.