전공/Algorithm
[Algorithm] 계수 정렬
으녜
2022. 3. 14. 22:06
728x90
※ 계수 정렬?
크기를 기준으로 세는 알고리즘
계수 정렬은 '범위 조건'이 존재하는 경우에 한해 굉장히 빠른 알고리즘이다. 다음의 5 이하 자연수 데이터들을 오름차순으로 계수 정렬해보자.
[1,3,2,4,3,2,5,3,1,2,3,4,4,3,5,1,2,3,5,2,3,1,4,3,5,1,2,1,1,1]
<정렬 과정>
1) 1부터 5까지 숫자의 개수를 셀 list를 만든다.
2) 데이터 셋을 돌면서 나오는 숫자에 해당하는 count를 +1 해준다.
3) 각각 count 한만큼 반복하여 출력(또는 list 원소 추가)한다.
이를 Python으로 구현한 Code는 다음과 같다.
[Python Code 👩🏻💻]
data_set = [1,3,2,4,3,2,5,3,1,2,3,4,4,3,5,1,
2,3,5,2,3,1,4,3,5,1,2,1,1,1]
count = [0]*5
result_set = []
for i in data_set:
count[i-1] +=1
for i in range(len(count)):
if (count[i] != 0):
for j in range(count[i]):
result_set.append(i+1)
print(count)
print(result_set)
Code Review >
1 ) 첫 번째 for문을 통해 1~5까지의 각 개수를 count 한다.
2 ) 두 번째 for문을 통해 count가 0이 아니라면 그 수만큼 해당 숫자를 list에 추가한다.
위와 같이 구현하고 보니 python 내 count 함수로 구현하면 더 쉽게 구현이 될 것 같아서 시도해보았다.
[두 번째 Python Code 👩🏻💻]
data_set = [1,3,2,4,3,2,5,3,1,2,3,4,4,3,5,1,
2,3,5,2,3,1,4,3,5,1,2,1,1,1]
result_set = []
for i in range(6):
if(data_set.count(i+1) !=0):
for j in range(data_set.count(i+1)):
result_set.append(i+1)
print(result_set)
Code Review >
1 ) count 함수를 이용하여 바로 각 숫자의 개수를 센 다음 for문을 통해 count 한 개수만큼 result_set list에 숫자를 추가시킨다.
계수 정렬의 시간 복잡도는?
위 정렬에서 데이터의 크기가 1~5라는 점에서 반복문 자체도 1부터 5까지만 반복한다는 것을 알 수 있다. 모든 데이터의 크기를 메모리 상에 표현할 수만 있다면 O(N)의 속도로 정렬을 수행할 수 있다.
728x90