배열 내 항목들의 순서를 결정하기 위해 각 항목이 몇 개씩 있는지 세는 작업을 하여 선형 시간에 정렬하는 효율적인 알고리즘
# 오름차순으로 정렬
[0, 4, 1, 3, 1, 2, 4, 1]
Data = [0, 4, 1, 3, 1, 2, 4, 1]
counts = [0] * (max(Data)+1)
tmp = [0] * len(Data) # Data를 오름차순 시킨 배열
# Data 내 원소들의 출현 회수를 counts에 담고, 인덱스로 확인
for num in Data:
counts[num] += 1
# counts의 원소는 각 인덱스의 횟수를 담고 있는데, 이를 누적합으로 바꿈
for i in range(1, len(counts)):
counts[i] += counts[i-1]
# 1. Data의 맨 오른쪽부터 값을 뽑고(Data[i]),
# 2. 이를 인덱스로 하는 counts의 값을 다시 tmp의 인덱스로 넣고 tmp[counts[Data[i]]]
# 3. 해당 값을 Data[i]로 준다. tmp[counts[Data[i]]] = Data[i]
for i in range(len(Data)-1, -1, -1):
tmp[counts[Data[i]]-1] = Data[i]
counts[Data[i]] -= 1
print(tmp)