1. 버블 정렬
첫 요소와 두번째 요소를 비교하고 작은 것을 앞으로, 그리고 두번째와 세번째를 비교해서 작은 것을 앞으로를 반복.
그러면 한번 실행했을 때 가장 큰 값이 뒤로 가기 때문에 그 다음 실행에선 마지막을 제외하고 같은 것을 반복.
그러면 비교 횟수가 처음엔 n-1번부터 시작해서 하나씩 줄어서 마지막에 1번을 한다.
1부터 n-1까지 더하면 식은 n(n-1)/2 다. (등차수열의합 공식)
첫 요소부터 비교하면서 마지막 요소까지 큰 값이 올라가는게 버블같다고 해서 버블 정렬.
정렬 중 무식하고 비효율적이다. 하지만 구현이 간단하다는 장점이 있다.
2. 삽입 정렬
버블 정렬이 뒤에서 부터 정렬한다면 삽입정렬은 앞에서부터 정렬한다. 처음에 맨 앞 두개를 비교해서 자기보다 작은 값 뒤에 삽입하고 범위를 세개, 네개로 늘려 반복한다. 버블 정렬이 정렬 대상을 늘릴 때 삽입 정렬은 정렬 대상을 줄인다.
비교 횟수는 1부터 n-1까지 더한 값으로 버블 정렬과 같다. 하지만 삽입 정렬은 정렬되어 있을 경우는 비교를 하지 않는다.
그래서 버블 정렬보다 낫다. 그래도 시간복잡도가 O(N^2)이기 때문에 여전히 느리다.
3. 퀵 정렬
퀵 정렬은 큰 문제를 잘게 나눠서 해결하는 분할 정복 원리를 이용한다. 특정 요소 기준 작은 것은 모두 왼쪽으로 큰 것은
모두 오른쪽으로 보내고 이것을 반복한다. 그래서 이것을 어떻게 구현할 것인가? 리스트에서는 기준 요소 앞 뒤로 보내는 것이 어려운 일이 아니지만 배열에서는 생각을 좀 해봐야 한다.
먼저 왼쪽->오른쪽으로 가면서 기준요소보다 큰 값을 찾고, 오른쪽->왼쪽으로 가면서 기준요소보다 작은 값을 찾은 후
둘을 바꾼다. 그것을 반복하고 둘이 만나면 기준요소를 왼쪽 데이터 집합의 마지막 요소와 교환한다. 분할정복은 재귀함수를 이용해서 구현할 수 있다.
퀵정렬의 속도는 이상적일 경우 한번에 데이터 집합이 두개씩 쪼개져서 8개로 나눌 때 3번의 재귀호출, 16번일 때 4번의 재귀호출해서 log2n로 빠르고 최악의 경우에도 버블, 삽입 정렬과 속도가 비슷하다. 평균 속도는 nlog2n이다.
https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html
[알고리즘] 퀵 정렬(quick sort)이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
'알고리즘' 카테고리의 다른 글
| [알고리즘] BFS,DFS,다익스트라,MST 사용하는 경우 (0) | 2025.05.28 |
|---|---|
| [알고리즘] 유클리드 호제법을 이용한 최대공약수, 최소공배수 구하기 (0) | 2024.04.17 |
| [알고리즘] 동적 계획법(DP) - TIC-TAE-TOE(3목) (0) | 2023.02.23 |
| [알고리즘] 동적 계획법(DP) - LIS(Longest Increasing Subsequence) (0) | 2023.02.22 |
| [알고리즘] 동적 계획법(DP) - 조합 (0) | 2023.02.22 |