CODING TEST/ALGORITHM - 개념
[Python] 정렬 알고리즘 정리 : 선택 / 삽입 / 퀵 / 계수 정렬
쏘니(SSony)
2023. 1. 9. 19:24
< 비교 기반 정렬 알고리즘 >
1. 선택 정렬 : 가장 작은 데이터를 '선택'한 뒤 가장 앞으로 보내기
array = [7, 6, 3, 5]
for i in range(len(array)):
min_ind = i # 비교 대상의 값을 min_ind로 설정
for j in range(i+1, len(array)):
if array[min_ind] > array[j]
min_ind = j # 가장 작은 원소의 인덱스를 min_ind로 설정
array[i], array[min_ind] = array[min_ind], array[i]
print(array)
- 시간 복잡도 : O(N^2)
2. 삽입 정렬 : 두번째 원소부터 움직이면서 정렬
array = [7, 6, 3, 5]
for i in range(1, len(array)):
for j in range(i, len(array)): # 모든 원소 확인
if array[j] < array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break
print(array)
- 시간 복잡도 : O(N^2)
3. 퀵 정렬 : 가운데 기준 피벗을 잡고 큰 데이터와 작은 데이터의 위치 교환
array = [7, 6, 3, 5]
def quick_sort(array):
# 리스트가 하나 이하의 원소일 경우
if len(array)<= 1: return array
pivot = array[0] # 첫번째 원소
tail = array[1:] # 피벗을 제외한 리스트
left_array = [x for x in tail if x <= pivot] # 분할된 왼쪽 부분
right_array = [x for x in tail if x > pivot] # 분할된 오른쪽 부분
# 재귀적으로 정렬
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array)
- 시간복잡도 : O(NlogN)
< 그 외 알고리즘 >
4. 계수 정렬
- 모든 범위의 데이터를 담을 수 있는 빈 배열 선언 후 데이터의 값과 동일한 인덱스에 넣기
- 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능
- 가장 큰 데이터와 가장 작은 데이터의 차이가 1,000,000을 넘지 않을 때 효과적
ex) 성적 데이터
array = [7, 5, 6, 3, 2, 9, 0, 6, 5, 3, 1, 4]
# 모든 범위를 포함하는 리스트 선언 및 초기화
count = [0] * (max(array) + 1)
# 데이터에 해당하는 인덱스의 값 증가
for i in range(len(array)):
count[array[i]] += 1
for i in range(len(count)):
for j in range(count[i]): # count[i]만큼 숫자 출력
print(i, end=' ')
- 시간복잡도 : O(N+K) - 최악의 경우