A. 정렬 알고리즘
1. 버블 소팅
a. 버블 소팅이란?
🌟 서로 인접한 두 원소를 비교하며 리스트나 배열의 요소들을 정렬하는 방법
컴퓨터 과학 및 프로그래밍에서 사용되는 정렬 알고리즘 중 하나
간단하고 이해하기 쉽다
b. 작동방식
1) 비교 단계
리스트 또는 배열을 처음부터 끝까지 반복하면서 인접한 두 요소를 비교
이때, 첫 번째 요소가 두 번째 요소보다 크다면 두 요소를 교체
2) 교체 단계
만약 첫 번째 요소가 두 번째 요소보다 크면 두 요소를 교체
그 결과로 큰 요소가 리스트의 끝쪽으로 "버블"처럼 이동하게 되며, 작은 요소는 앞쪽으로 이동
3) 반복
비교와 교체 단계를 리스트의 첫 번째 요소부터 마지막 요소까지 계속 반복 : 패스
이러한 과정을 하나의 패스(pass)라고 부르며, 패스가 끝나면 가장 큰 요소가 리스트의 마지막 위치로 이동
4) 정렬이 완료될 때까지 반복
위의 과정을 리스트가 정렬될 때까지 반복
즉, 패스를 수행하면 리스트에서 가장 큰 요소가 마지막 위치로 이동하게 되므로,
정렬되지 않은 부분 리스트의 크기가 1 감소함
정렬이 완료될 때까지 이러한 패스를 반복하여 리스트를 정렬
🎨 도식화
c. 장점과 단점
👍 장점
- 단순하고 이해하기 쉬움
- 작은 크기의 데이터나 리스트가 이미 거의 정렬되어 있는 경우에는 버블 소팅이 유용
👎 단점
- 대규모 데이터에 대해서는 비효율적
- 평균 및 최악의 경우 시간 복잡도는 O(n^2)
- 더 효율적인 정렬 알고리즘(예: 병합 정렬, 퀵 소트)을 사용하는 것이 좋을 수 있음
d. 버블 소팅 코드
📘 문법
//1. 스왑하는 기능
void Swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
//버블 소팅기능 생성
//int lotto[6] = { 1, 42, 3, 15, 5, 6 }; 를 소팅한다고 가정
void Sort(int* numbers, int count) { //2.
for (int i = 0; i < count; i++) { //6.
for (int j = 0; j < count - 1 - i; j++) { //3. 5.
if (numbers[j] > numbers[j + 1]) { //4.
Swap(numbers[j], numbers[j + 1]);
}
}
}
}
🤍 문법 설명
- Swap : a와 b를 스왑하는 기능을 생성
- Sort : 배열과 배열의 길이를 입력받고
- 5번 비교를 하면 6번째에는 비교할게 없으니 count -1을 해줌
- n번과 n+1번을 비교하고 조건에 맞다면 둘 위치를 변경
- 한 번 패스가 돌았다면 맨 마지막 배열은 가장 큰 배열이니 다시 검사 안해도 됨 = i번째도 빼줌
- 위의 검증을 총 배열의 길이 -1만큼 해줘야 하니 2중 for문을 작성함
'자료구조와 알고리즘 > Algorithm' 카테고리의 다른 글
분할 정복(Divide and Conquer) 알고리즘 1 : 이진 탐색 (Binary Search) (0) | 2024.02.22 |
---|---|
[게임 프로그래머 입문 올인원] A* 길찾기 알고리즘 + Maze project (62강) (0) | 2024.02.19 |
[게임 프로그래머 입문 올인원] 다익스트라 (61강) (0) | 2024.02.19 |
[게임 프로그래머 입문 올인원] 그래프와 알고리즘 : DFS, BFS (58, 59강) (0) | 2024.02.17 |
[게임 프로그래머 입문 올인원] 선형 자료구조 : 시간복잡도 (49강) (0) | 2024.02.14 |