기술 관련 정리
정렬 알고리즘 - 계수 정렬(Counting Sort)
bewisesh91
2022. 4. 9. 15:59
728x90
원소들의 순서를 결정하기 위해 원소들이 몇 개씩 있는지 세어서 적절한 위치에 선형 시간에 정렬하는 알고리즘을
의미한다. 비교 기반 정렬 알고리즘과 다르게 직접 데이터의 값을 비교하지 않습니다.
- 최초 배열 arr에 존재하는 값의 각 원소의 개수를 세어줄 새로운 배열 count를 만들어줍니다.
- count 배열의 원소를 누적합 값으로 갱신해줍니다.
- arr의 길이와 같은 result 배열을 만들어줍니다.
- arr의 각 원소의 값을 count의 인덱스로 사용해 값을 가져온 후, 해당 값을 다시 result의 인덱스로
- 사용해 arr의 값을 저장합니다.
- count[arr[i]]의 값을 하나 줄여줍니다.
- 위 과정을 반복합니다.
시간복잡도는 **O(n + k)**입니다. k가 충분히 작을 경우 시간복잡도가O(n)이 되겠지만,
k값이 커질 경우 k가 시간복잡도를 지배하게 됩니다. 공간복잡도는 O(k)입니다.
장점
- 선형 시간에 정렬이 가능하다.
단점
- 정수나, 정수로 표현할 수 있는 자료에 대해서만 적용 가능하다.
- 각 항목의 발생 횟수를 기록해야 하기 때문에 정수로 인덱스 되는 카운트들의 배열(메모리) 사용한다.
- 카운트를 위한 충분한 공간을 할당하기 위해서는 집합 내의 가장 큰 정수를 알아야한다.
def counting_sort(arr):
count = [0] * (max(arr) + 1)
for num in arr:
count[num] += 1
for i in range(1, len(count)):
count[i] += count[i-1]
result = [0] * (len(arr))
for num in arr:
idx = count[num]
result[idx - 1] = num
count[num] -= 1
return result