Counting Sort란 값의 발생 횟수를 계산하는 누적 카운트를 사용하며,
누적 카운트를 갱신해서 순서대로 숫자를 배치하는 방식입니다.
Counting Sort는 배열 내의 최댓값 + 1 만큼의 배열 길이가 필요하므로
정수의 범위가 크면 매우 비효율 적입니다.
파이썬에 내장된 collections.defaultdict
모듈의 딕셔너리 타입을 활용하여 구현해보겠습니다.
defaultdict를 활용한 Counting Sort
from collections import defaultdict
def count_sort_dict(seq):
result = []
dic = defaultdict(list)
# c의 key값(x)에 x를 append -> 각 key에는 x의 갯수만큼 x값이 append
for num in seq:
dic[num].append(num)
# c의 key값의 최소값부터 최대값까지 extend 반복
# -> 각 key에는 x값의 갯수만큼 x가 list형태로 저장되어 있으므로 extend
for i in range(min(dic), max(dic) + 1):
result.extend(dic[i])
print(result)
seq = [3, 5, 2, 6, 8, 1, 0, 3, 6, 2, 5, 4, 1, 5, 3]
count_sort_dict(seq)
dic 딕셔너리는 배열의 원소 x가 key값이 되고, 그 key값은 x의 갯수만큼 x값이 리스트 형태로 저장되어 있습니다.
반복문을 통해 min(), max()를 이용하여 dic의 가장 작은 key값부터 가장 큰 key값 까지
key에 해당하는 리스트를 결과리스트에 extend를 해주면 오름차순으로 정렬이 됩니다.
정렬 전 : [3, 5, 2, 6, 8, 1, 0, 3, 6, 2, 5, 4, 1, 5, 3]
정렬 후 : [0, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6, 6, 8]
[Python] 정렬 / 병합 정렬(Merge Sort) (0) | 2021.12.07 |
---|---|
[Python] 정렬 / 퀵 정렬(Quick Sort) (0) | 2021.11.30 |
[Python] 정렬 / 삽입 정렬(Insertion sort) (0) | 2021.11.24 |
[Python] 정렬 / 버블 정렬(Bubble sort) / 선택 정렬(Selection sort) (0) | 2021.11.24 |
[Python] 스택 활용한 문제(문자열 거꾸로 출력, 괄호의 갯수 판별, 10진수를 n진수로 변환) (0) | 2021.11.19 |