언어/C언어
[자료구조] 정렬 알고리즘
배이즈
2025. 4. 11. 19:49
1. 버블 정렬 (Bubble Sort)
인접한 두 수를 비교해서, 크기가 순서대로 되어 있지 않으면 서로 교환한다.
이 과정을 반복해서 가장 큰 수가 맨 뒤로 떠오르는 방식 like 거품
시간 복잡도 (문제를 해결하는데 걸리는 시간과 입력의 함수 관계)
- 최악: O(n²)
- 최선 (이미 정렬된 경우): O(n) → 개선된 버전일 때
- 평균: O(n²)
[4, 6, 2, 7, 5] → 비교 4-6 (X), 6-2 (swap), 6-7 (X), 7-5 (swap) → [4, 2, 6, 5, 7]
2. 선택 정렬 (Selection Sort)
아직 정렬되지 않은 부분에서 가장 작은 값을 선택해서 맨 앞의 요소와 교환한다. 이 과정을 계속 반복!
시간 복잡도:
- 최악, 최선, 평균 모두 O(n²)
- 교환 횟수가 적음 (항상 n번만 교환)
[4, 6, 2, 7, 5] → 2가 제일 작음 → 2 와 4 swap → [2, 6, 4, 7, 5]
3. 삽입 정렬 (Insertion Sort)
현재 값을 앞의 정렬된 부분과 비교하면서 알맞은 위치에 삽입한다. (보통 우리가 생각하는 정렬방식)
시간 복잡도:
- 최악: O(n²)
- 최선 (이미 정렬된 경우): O(n)
- 평균: O(n²)
[4, 6, 2, 7, 5] → 6은 4보다 크니 그대로 → 2는 4보다 작으니 앞으로 → [2, 4, 6, 7, 5]
버블 정렬 코드
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr[10] = { 4, 6, 2, 7, 5, 1, 8, 9, 10, 3 };
int temp;
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("\n");
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
- arr[10]은 10개의 정수를 가진 배열이다.
- temp는 두 값을 교환할 때 사용할 임시 변수이다.
1. for문으로 초기 배열을 출력한다.
2. 이중 반복문
-
- 바깥 루프 i는 9회 반복
- 정렬된 큰 수는 뒤로 가므로 안쪽 루프는 점점 비교 횟수가 줄어든다
- arr[j] > arr[j + 1]일 때 자리 교환
3. 정렬 완료 후 배열을 출력하면 아래와 같다.
입력 배열: 4 6 2 7 5 1 8 9 10 3
정렬 결과: 1 2 3 4 5 6 7 8 9 10
선택 정렬 구현해보기
#include <stdio.h>
int main() {
int arr[10] = { 4, 6, 2, 7, 5, 1, 8, 9, 10, 3 };
int min_idx, temp;
// 초기 배열 출력
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
// 선택 정렬 코드
for (int i = 0; i < 9; i++) {
min_idx = i;
for (int j = i + 1; j < 10; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
// 최솟값을 현재 위치(i)와 교환
temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
printf("\n");
// 정렬된 배열 출력
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
삽입 정렬 구현해보기
#include <stdio.h>
int main() {
int arr[10] = { 4, 6, 2, 7, 5, 1, 8, 9, 10, 3 };
int key, j;
// 초기 배열 출력
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
// 삽입 정렬
for (int i = 1; i < 10; i++) {
key = arr[i];
j = i - 1;
// key보다 큰 값을 오른쪽으로 이동
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// key를 알맞은 위치에 삽입
arr[j + 1] = key;
}
printf("\n");
// 정렬된 배열 출력
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}