CS/Algorithm
[Algorithm] 선택정렬, 삽입정렬, 계수정렬
estherseo
2024. 6. 30. 18:56
1. 선택정렬
"""
1. 특징
- average,worst,best : 모두 O(N^2)로 동일
2. 시간 복잡도 : O(N^2)
N + (N-1) + (N-2) + ... + 1
(N^2+N-2)/2 => O(N^2)
"""
array = [7,4,6,2,1,9,0]
for i in range(len(array)):
min_index = i #가장 작은 원소의 인덱스
for j in range(i+1, len(array)):
print(j, end=' ')
if array[min_index] > array[j]:
min_index = j
print()
array[i], array[min_index] = array[min_index], array[i] #swap
print(array)
2. 삽입정렬
"""
1. 특징
선택정렬보다 효율적임.
현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작.
2. 시간복잡도
- worst : O(N^2)
- average : O(N^2)
- best : O(N)
"""
array = [7,4,6,2,1,9,3]
for i in range(1, len(array)):
for j in range(i, 0, -1):
print(j, end=' ')
if array[j] < array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break
print()
print(array)
3. 계수정렬
"""
1. 특징
공간 복잡도는 높지만, 특정 조건 만족시 빠르게 동작
데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을때만 사용 가능
최악의 경우에도 O(N+K)를 보장
2. 시간복잡도 * 공간복잡도도 O(N+K)
- worst : O(N+K)
- average : O(N+K)
- best : O(N+K)
* 최악인 경우 : 데이터가 0, 999999 단 2개일 때
* 효과적인 경우 : 동일한 값을 가지는 데이터가 여러 개 등장할 때
"""
# 가정 : 모든 원소의 값이 0보다 크거나 같다고 가정
array = [7,4,6,2,1,9,3,2]
# 모든 범위를 포함하는 리스트 선언(0으로 초기화)
count = [0]*(max(array)+1)
for i in array:
count[i] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' ')
참고 - https://www.youtube.com/watch?v=KGyK-pNvWos&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=4