728x90
반응형
1. 버블 정렬(Bubble Sort)
- 인접한 두 요소를 비교하여 크기가 순서에 맞지 않으면 서로 교환
- 큰값이나 작은값이 반복적으로 앞으로 혹은 뒤로 이동하는 방식으로 동작
- 시간 복잡도: O(N) ~ O(N^2)
- 동작 과정
- 배열의 첫 번째 요소부터 인접한 두 요소를 비교
- 조건에 따라 교환하며 배열 끝까지 진행
- 한번 순회가 끝나면 가장 큰 값이 배열 끝에 위치함
- 이 과정을 배열 크기만큼 반복
- 예시 코드
#include <stdio.h>
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) { // 오름차순 정렬
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {5, 2, 9, 1, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("정렬 전 배열: ");
printArray(arr, n);
bubbleSort(arr, n);
printf("정렬 후 배열: ");
printArray(arr, n);
return 0;
}
2. 선택 정렬(Selection Sort)
- 배열에서 가장 작거나 큰 요소를 찾아 현재 위치에 배치
- 나머지 요소에서 다시 가장 작거나 큰 요소를 찾아 다음 위치에 배치
- 시간복잡도: O(N^2)
- 동작 과정
- 배열에서 최소값을 찾음
- 최소값을 현재 정렬된 영역의 마지막 요소와 교환
- 나머지 요소에 대해 같은 과정을 반복
- 예시 코드
#include <stdio.h>
void selectionSort(int arr[], int n) {
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;
}
}
// 최소값을 현재 위치로 교환
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr) / sizeof(arr[0]);
printf("정렬 전 배열: ");
printArray(arr, n);
selectionSort(arr, n);
printf("정렬 후 배열: ");
printArray(arr, n);
return 0;
}
3. 삽입 정렬(Insertion Sort)
- 배열의 각 요소를 순차적으로 선택하여 이미 정렬된 부분과 비교한 후 적절한 위치에 삽입
- 정렬된 영역은 처음에 하나의 요소로 시작하며, 점차 확장됨
- 시간복잡도: O(N) ~ O(N^2)
- 동작 과정
- 두 번째 요소부터 시작하여 정렬된 영역에 삽입할 위치를 찾음.
- 요소를 해당 위치로 삽입하고 나머지 요소를 오른쪽으로 이동시킴.
- 모든 요소에 대해 반복
- 예시 코드
#include <stdio.h>
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; 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;
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("정렬 전 배열: ");
printArray(arr, n);
insertionSort(arr, n);
printf("정렬 후 배열: ");
printArray(arr, n);
return 0;
}
4. 세 정렬 알고리즘 비교
알고리즘 | 최선 시간 복잡도 | 평균 시간 복잡도 | 최악 시간 복잡도 | 공간복잡도 | 특징 |
버블 정렬 | O(N) | O(N^2) | O(N^2) | O(1) | 인접 요소를 비교하며 정렬 |
선택 정렬 | O(N^2) | O(N^2) | O(N^2) | O(1) | 최소값을 찾아 정렬된 영역에 배치. |
삽입 정렬 | O(N) | O(N^2) | O(N^2) | O(1) | 정렬된 영역에 삽입. |
- 버블정렬은 구조가 단순하고 이해하기 쉽지만, 실제로는 가장 비효율적
- 선택정렬은 매번 최소값을 선택하므로 비교 횟수는 많지만 교환 횟수는 적음
- 삽입정렬은 데이터가 이미 정렬에 가까운 경우 효율적으로 작동됨
728x90
반응형
'개발 > C' 카테고리의 다른 글
[C언어] 자료구조: 이진 트리 - 노드 생성, 삭제, 탐색 (3) | 2025.05.14 |
---|---|
[C언어] 정렬 알고리즘(분할 정복 알고리즘) - 병합정렬(Merge Sort), 퀵 정렬(Quick Sort) (0) | 2025.01.24 |
[C언어] 기초 자료구조 - 해시(Hash) (0) | 2025.01.22 |
[C언어] 기초 자료구조 - 힙(Heap) (0) | 2025.01.21 |
[C언어] 기초 자료구조 - 큐(Queue) (0) | 2025.01.21 |