0. 정렬
7 5 9 0 3 1 6 2 4 8
0 1 2 3 4 5 6 7 8 9
1. 선택정렬
7 5 9 0 3 1 6 2 4 8
0 5 9 7 3 1 6 2 4 8
0 5 9 7 3 1 6 2 4 8
0 1 9 7 3 5 6 2 4 8
...
for i in range():
print("Selection sort")
시간복잡도
2. 삽입 정렬
7 5 9 0 3 1 6 2 4 8 # 5는 7보다 작기에 7의 왼쪽에 삽입
5 7 9 0 3 1 6 2 4 8 # 9는 7보다 크기에 7의 오른쪽에 삽입
5 7 9 0 3 1 6 2 4 8 # 0은 9보다 작고, 7보다 작고, 5보다 작기에 5의 왼쪽에 삽입
0 5 7 9 3 1 6 2 4 8 # 3은 ...
...
for i in range():
print("Insertion sort")
시간복잡도
3. 퀵 정렬
⑤ 7 9 0 3 1 6 2 4 8 # Pivot은 5, 왼쪽에서부터 5보다 큰 숫자를 만날 때까지, 오른쪽에서부터는 5보다 작은 수를 만날때까지 이동한다.
⑤ 4 9 0 3 1 6 2 7 8 # 선택된 두 수를 비교하여 오름차순이 되도록 swap 한다.
⑤ 4 9 0 3 1 6 2 7 8
⑤ 4 2 0 3 1 6 9 7 8
⑤ 4 2 0 3 1 6 9 7 8 # 왼쪽에서부터 5보다 큰 6, 오른쪽에서부터 5보다 작은 1이 선택될 때 위치가 엇갈렸다.
1 4 2 0 3 ⑤ 6 9 7 8 # 위치가 엇갈리는 경우 '피벗'과 '작은 데이터'의 위치를 swap 한다.
1 4 2 0 3 < 5 < 6 9 7 8 # 이제 pivot(5)의 왼쪽은 모두 5보다 작고, 오른쪽은 모두 5보다 크다. 이렇게 pivot을 기준으로 데이터를 나누는 작업을 분할이라고 한다.
① 4 2 0 3 # 왼쪽 데이터 묶음안에서 동일한 방식으로 정렬을 수행한다.
⑥ 9 7 8 # 오른쪽도 동일하게 한다.
시간복잡도
0 1 2 3 4 5 6 7 8 9
4. 계수 정렬
7 5 9 0 3 1 6 2 9 1 4 8 0 5 2
index 0 1 2 3 4 5 6 7 8 9
count 0 0 0 0 0 0 0 0 0 0
7 5 9 0 3 1 6 2 9 1 4 8 0 5 2
index 0 1 2 3 4 5 6 7 8 9
count 0 0 0 0 0 0 0 1 0 0
7 5 9 0 3 1 6 2 9 1 4 8 0 5 2
index 0 1 2 3 4 5 6 7 8 9
count 0 0 0 0 0 1 0 1 0 0
7 5 9 0 3 1 6 2 9 1 4 8 0 5 2
index 0 1 2 3 4 5 6 7 8 9
count 2 2 2 1 1 2 1 1 1 2
output : 0 0 1 1 2 2 3 4 5 5 6 7 8 9
5. 정리