Udemy - 지수 정렬
지수 정렬이란?
이전까지 공부했던 정렬들은 모두 “비교 정렬” 방식을 기반으로 했다.
하지만 지수 정렬은 숫자가 가지는 특성, 즉, 이진법에 의한 자릿수를 기반으로 정렬을 한다.
사실 이렇게만 설명하면 이해가 쉽지 않기 때문에 아래의 시각자료를 보며 이해하면 좋을 것 같다.
10진수 기준 각 자리수의 값(0~9)을 각각 하나의 상자들로 구성해준다고 생각한다. 그리고 가장 첫번째 자리수 부터 검사를 시작하는데, 첫 자리수가 0이면 0에 담고, 8이면 8에 담듯 숫자의 절대적 크기는 고려하지 않은채 각 자리수의 크기로만 배열을 골라낸다. 그렇게 가장 긴 자리수 까지 검사를 완료하면 숫자가 오름차순으로 올바르게 정렬되는 것을 확인할 수 있다.
이는 각 숫자들의 절대적 크기를 비교한 것이 아닌, 각 자리수를 비교하며 정렬을 한 것이기 때문에 이전의 정렬 방식과는 큰 차이점을 보인다고 할 수 있다.
getDigit 헬퍼 (step 1)
우리는 자리수 별로 숫자들을 비교해나가야 하기 때문에, 각 숫자들의 n자리수 값이 무엇인지 반환해주는
getDigit()
헬퍼 함수가 필요하다.
1 | function getDigit(num, i) { |
digitCount 헬퍼 (step 2)
이제 자리수들을 도출하는 헬퍼 함수를 구현했으니, 반복문을 돌리기 위해 각 숫자들의 총 자리수가 몇인지 반환해주는
digitCount()
헬퍼함수를 구현해야 한다.
1 | function digitCount(num, i) { |
maxDigit 헬퍼 (step 3)
위에서 각 숫자들의 총 자리수 길이를 구하는 헬퍼함수를 구현했다.
따라서 이제 해당 숫자들 중에서 가장 긴 자리수를 반환해주는maxDigit()
헬퍼 함수만 구현해주면 된다.
1 | function maxDigit(arr) { |
지수 정렬 구현 (step 4)
이제 위의 모든 헬퍼 함수들을 활용해서 지수 정렬을 구현해주기만 하면 된다.
Array.from()
전혀 활용하고 있지 못했던 메소드다…. 신세계였어서 한번 정리를 해봤다.
1 | let testArray = Array.from({ length: 10 }, () => []); |
지수 정렬 구현
1 | function radixSort(arr) { |
지수 정렬의 시간복잡도
지수 정렬에 대한 시간복잡도는 두 쟁점이 존재한다.
하나는 지수정렬이 O(nk)라는 주장과, O(nlogn)이라는 주장이다.
아래 위키피디아에 들어가면 이에 대한 내용이 잘 정리되어 있다.