본문 바로가기
알고리즘

기수 정렬(Radix Sort)

by 까망 하르방 2021. 2. 23.
반응형

기수 정렬

O(N + K)

- 원소들의 자릿수에 따라서 정렬 

① 1의 자릿수를 기준으로 정렬

② 10의 자릿수를 기준으로 정렬

③ 100의 자릿수를 기준으로 정렬

④ ... 최대 자릿수의 길이만큼 반복

작은 자리수부터 비교하는 방식을 LSD

큰 자리수부터 비교하는 방식을 MSD

시간복잡도는 O(N + K)로, K는 최대 자릿수의 길이.

 

구현

일반적으로는 각 자릿수 오름차순으로 담기위해 Queue를 이용합니다.

 

① 1의 자릿수를 기준으로 정렬

- 자릿수에 따른 큐에 원소를 집어넣는다. (N번)

- 큐에 있는 원소를 pop() 하여 원소를 재배열 합니다. (N번)

 

② 10의 자릿수를 기준으로 정렬

 

③ 100의 자릿수를 기준으로 정렬

- 최대 자릿수의 길이 = 3이므로 총 3번 진행

- (십진수의 경우) 0~9까지의 자릿수를 담으므로 10개의 Queue 이용.

  이진수나 문자열과 같이 큐의 개수가 변할 수 있음

  ex. [“orange”, “harbang”]

- 부동소숫점이 없는 정수여야 한다 (ex. [2.14, 17.1] 와 같은 리스트는 정렬 불가)

+ 버킷(Queue)과 같은 추가 메모리가 필요한 단점 존재. 

 

Code

#include <iostream>
#include <queue>
using namespace std;

void radixSort(int arr[], int n) {
    // 최대 자리수를 가진 숫자를 구합니다.
    int max = arr[0];
    for (int i = 1; i < n; i++) {
        max = max > arr[i] ? max : arr[i];
    }
    // 최대 자리수를 구해낸다.
    int k = 1;
    while (max / 10) {
        k *= 10;
        max /= 10;
    }
    queue<int> queue[10];
    int digit = 1, mod = 10;
    while (digit <= k) {
        // 자리수에 맞게 Queue push
        for (int i = 0; i < n; i++) {
            queue[(arr[i] % mod) / digit].push(arr[i]);
        }
        // Queue에 들어가 있는 원소를 배열에 재배치
        int j = 0;
        for (int i = 0; i < 10; i++) {
            while (queue[i].size() > 0) {
                arr[j++] = queue[i].front();
                queue[i].pop();
            }
        }
        // 비교할 자릿수 변경
        digit *= 10; mod *= 10;
    }
}

void main(void) {
    int n = 8;
    int arr[8] = { 170, 45, 75, 90, 2, 24, 802, 66 };
    radixSort(arr, n);
    for (int i = 0; i < n; i++) {
        cout << arr[i] << ' ';
    }
}

 

반응형

'알고리즘' 카테고리의 다른 글

DFS와 BFS 비교  (0) 2021.02.24
[예제] 합병 정렬 (Merge Sort)  (0) 2021.02.23
정렬 알고리즘 비교  (0) 2021.02.23
접미사 배열(Suffix Array)  (0) 2021.02.23
선택 정렬(Selection Sort)  (2) 2021.02.23

댓글