728x90
반응형
정렬 알고리즘 총정리 (버블, 삽입, 선택, 퀵, 병합)
이전 글에서는 힙(Heap)과 우선순위 큐에 대해 알아봤습니다.
이번에는 정렬(Sorting) 알고리즘 중 대표적인 5가지를 소개하며, 각 알고리즘의 원리와 성능, 사용 예시를 정리해봅니다.
1. 정렬 알고리즘이란?
정렬 알고리즘은 데이터를 오름차순 또는 내림차순으로 순서대로 정렬하는 알고리즘입니다.
- 검색 속도 향상, 이진 탐색 가능, 데이터 시각화/분석에 필수
- 각 알고리즘은 시간 복잡도, 공간 복잡도, 안정성 등이 다름
2. 주요 정렬 알고리즘 비교
알고리즘 평균 시간 복잡도 공간 복잡도 안정 정렬 특징
버블 정렬 | O(n²) | O(1) | O | 인접한 값 반복 비교, 느리지만 단순함 |
선택 정렬 | O(n²) | O(1) | X | 가장 작은 값을 선택해 앞으로 보냄 |
삽입 정렬 | O(n²) | O(1) | O | 이미 정렬된 부분에 삽입 방식 |
퀵 정렬 | O(n log n) | O(log n) | X | 분할 정복, 빠르지만 불안정함 |
병합 정렬 | O(n log n) | O(n) | O | 안정적, 대용량 데이터에 적합 |
3. 각 정렬 알고리즘 예시 (C#)
버블 정렬 (Bubble Sort)
void BubbleSort(int[] arr)
{
int n = arr.Length;
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
(arr[j], arr[j + 1]) = (arr[j + 1], arr[j]);
}
}
}
}
선택 정렬 (Selection Sort)
void SelectionSort(int[] arr)
{
int n = arr.Length;
for (int i = 0; i < n - 1; i++)
{
int minIndex = i;
for (int j = i + 1; j < n; j++)
{
if (arr[j] < arr[minIndex]) minIndex = j;
}
(arr[i], arr[minIndex]) = (arr[minIndex], arr[i]);
}
}
삽입 정렬 (Insertion Sort)
void InsertionSort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
퀵 정렬 (Quick Sort)
void QuickSort(int[] arr, int left, int right)
{
if (left >= right) return;
int pivot = arr[(left + right) / 2];
int index = Partition(arr, left, right, pivot);
QuickSort(arr, left, index - 1);
QuickSort(arr, index, right);
}
int Partition(int[] arr, int left, int right, int pivot)
{
while (left <= right)
{
while (arr[left] < pivot) left++;
while (arr[right] > pivot) right--;
if (left <= right)
{
(arr[left], arr[right]) = (arr[right], arr[left]);
left++; right--;
}
}
return left;
}
병합 정렬 (Merge Sort)
void MergeSort(int[] arr)
{
if (arr.Length <= 1) return;
MergeSortRecursive(arr, 0, arr.Length - 1);
}
void MergeSortRecursive(int[] arr, int left, int right)
{
if (left >= right) return;
int mid = (left + right) / 2;
MergeSortRecursive(arr, left, mid);
MergeSortRecursive(arr, mid + 1, right);
Merge(arr, left, mid, right);
}
void Merge(int[] arr, int left, int mid, int right)
{
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right)
{
temp[k++] = (arr[i] <= arr[j]) ? arr[i++] : arr[j++];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= right) temp[k++] = arr[j++];
for (int t = 0; t < temp.Length; t++)
{
arr[left + t] = temp[t];
}
}
4. 실생활 예시로 이해하기
- 버블 정렬 = 비눗방울이 위로 올라가듯 큰 숫자가 점점 뒤로 밀림
- 삽입 정렬 = 트럼프 카드 정렬하기
- 선택 정렬 = 전체 중 가장 작은 값을 골라서 앞으로 옮김
- 퀵 정렬 = 기준(pivot)을 정하고 왼쪽/오른쪽으로 나눠 정렬
- 병합 정렬 = 정렬된 작은 배열들을 병합하여 큰 배열로 만듦
이번 글에서는 정렬 알고리즘 5종 (버블, 선택, 삽입, 퀵, 병합) 을 비교하며 정리했습니다.
- 단순 정렬은 구조 이해에 좋고
- 퀵/병합 정렬은 실무에서도 자주 사용됩니다.
이로써 자료구조 시리즈의 기초 편이 마무리됩니다.
728x90
반응형
'개발이야기' 카테고리의 다른 글
C# 언어 심화 2편 – 람다식(Lambda)과 LINQ 고급 활용 (10) | 2025.04.25 |
---|---|
C# 언어 심화 1편 – delegate와 event 실전 응용 (8) | 2025.04.24 |
자료구조 시리즈 10편 (2) | 2025.04.22 |
자료구조 시리즈 9편 (0) | 2025.04.22 |
자료구조 시리즈 8편 (2) | 2025.04.22 |