정렬 알고리즘
Algorithm ·정렬 알고리즘
- 5가지의 정렬 알고리즘(선택정렬, 버블정렬, 삽입정렬, 병합정렬, 퀵정렬)에 대해서 정리하겠습니다.
N2 알고리즘
- 선택정렬 -> 선택한 인덱스에 맞는 값을 찾아 넣기
for (int i = 0; i < n; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++)
if (arr[minIndex] > arr[j]) minIndex = j;
swap(arr[i], arr[minIndex]);
}
- 버블정렬 -> 바로 옆에 있는 수와 지속적으로 비교하여 맞는 위치 찾아가기
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (arr[i] > arr[j]) swap(arr[i], arr[j]);
- 삽입정렬(최적의 경우 n만에 실행) -> 해당 숫자를 맞는 위치에 삽입한다.
for (int i = 1; i < n; i++) {
int com = arr[i];
int j = i - 1;
for (;j > -1 && arr[j] > com; j--)
arr[j + 1] = arr[j];
arr[j + 1] = com;
}
예를 들어)
5 4 3 2 1을 정렬한다고 할 때,
i = 1일 때, 4 5 3 2 1
i = 2일 때, 3 4 5 2 1
i = 3일 때, 2 3 4 5 1
i = 4일 때, 1 2 3 4 5 가 될 것이다.
추가적으로 설명하자면, 손 안의 카드를 정렬하는 방법과 유사하다.
앞에서부터 차례대로 이미 정렬된 부분과 비교하여 자신의 위치를 찾아 삽입한다.
NlogN 알고리즘
- 합병정렬 -> 분할정복을 이용하여 최대한 쪼갠 후 병합하면서 정렬한다.
void merge(int l,int m, int r) {
int com[101] = {};
int left = l, right = m + 1;
int idx = 0;
while (left <= m && right <= r) {
if (arr[left] < arr[right]) com[idx++] = arr[left++];
else com[idx++] = arr[right++];
}
while (left <= m) com[idx++] = arr[left++];
while (right <= r) com[idx++] = arr[right++];
for (int i = l; i <= r; i++) arr[i] = com[i-l];
return;
}
void mergeSort(int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(left, mid);
mergeSort(mid + 1, right);
merge(left, mid, right);
}
}
mergeSort(0, n - 1);
- 퀵정렬 -> 분할정복을 이용하여 쪼개면서 정렬하고 병합한다.
void quickSort(int start, int end) {
if (start >= end) return;
int p = start;
int i = p + 1;
int j = end;
while (i <= j) {
while (i <= end && arr[i] <= arr[p]) i++;
while (j > start && arr[j] >= arr[p]) j--;
if (i > j) swap(arr[p], arr[j]);
else swap(arr[i], arr[j]);
}
quickSort(start, j-1);
quickSort(j + 1, end);
}
quickSort(0,n-1);
퀵정렬 설명글 링크 https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html