본문 바로가기
정렬

기수 정렬(Radix Sort)

by seogenius 2021. 4. 2.

기수 정렬(Radix Sort)

정렬할 원소의 키 값에 해당하는 버킷(bucket)에 원소를 분배했다가 순서대로 꺼내는 방법으로 정렬. 기수만큼의 버킷이 필요하다.

기수란 즉 '자릿수'이므로 10진수 원소들을 정렬할 때는 0~9 까지의 10개의 버킷을 사용한다.

일의 자리에 대해서 정렬한 후 십의 자리에 대해 정렬 그 다음은 백의 자리에 대해서 정렬하는 방법을 이용한다.

정렬할 원소의 수 n과 키 값의 자릿수 d와 버킷의 수를 결정하는 기수 r에 따라 수행시간이 달라진다.

시간 복잡도는 O(d(n+r))이 된다.

예시)

{57, 16, 41, 2, 50, 6, 32, 31}

1. 0~9 까지의 10개의 버킷을 만든다.

버킷 0 ---- [ ]

버킷 1 ---- [ ]

버킷 2 ---- [ ]

버킷 3 ---- [ ]

버킷 4 ---- [ ]

버킷 5 ---- [ ]

버킷 6 ---- [ ]

버킷 7 ---- [ ]

버킷 8 ---- [ ]

버킷 9 ---- [ ]

2. 일의 자리에 대하여 기수 정렬을 수행한다.

버킷 0 ---- [ 50 ]

버킷 1 ---- [ 31, 41 ]

버킷 2 ---- [ 2, 32 ]

버킷 3 ---- [ ]

버킷 4 ---- [ ]

버킷 5 ---- [ ]

버킷 6 ---- [ 6, 16 ]

버킷 7 ---- [ 57 ]

버킷 8 ---- [ ]

버킷 9 ---- [ ]

===> 순서대로 꺼내기

{50, 31, 41, 2, 32, 6, 16, 57}

3. 십의 자리에 대하여 기수 정렬을 수행한다.

버킷 0 ---- [ 2, 6 ]

버킷 1 ---- [ 16 ]

버킷 2 ---- [ ]

버킷 3 ---- [ 31, 32 ]

버킷 4 ---- [ 41 ]

버킷 5 ---- [ 50, 57 ]

버킷 6 ---- [ ]

버킷 7 ---- [ ]

버킷 8 ---- [ ]

버킷 9 ---- [ ]

===> 순서대로 꺼내기

{2, 6, 16, 31, 32, 41, 50, 57}

프로그램 작성)

package test;

class Sort {
	public void RadixSort(int[] a, int base) {
		int size = a.length;
		int max = getMax(a);
		
		for(int i=1; i<=max; i*=base) {
			int[] count = new int[base];
			int[] output = new int[size];
			
			for(int j=0; j<size; j++) {
				count[(a[j]/i)%base]++;
			}
			
			for(int j=1; j<base; j++) {
				count[j]+= count[j-1];
			}
			
			for(int j=size-1; j>-1; j--) {
                int k = (a[j]/i)%base;
                output[count[k]-1] = a[j];
                count[k]--;
            }
			
            for(int j=0; j<size; j++) {
            	a[j]=output[j];
            }
		}
	}
	
	public int getMax(int[] a) {
		int max = a[0];
		
		for(int i=1; i<a.length; i++) {
			if(a[i] > max) {
				max = a[i];
			}
		}
		
		return max;
	}
}

public class Test {
	public static void main(String[] args) {
		int a[] = {57, 16, 41, 2, 50, 6, 32, 31};

		System.out.println("정렬 전 원소 : ");
		for(int i=0; i<a.length; i++) {
			System.out.printf(" %d", a[i]);
		}
		System.out.println();

		Sort s = new Sort();
		s.RadixSort(a, 10);

		System.out.println("정렬 후 원소 : ");
		for(int i=0; i<a.length; i++) {
			System.out.printf(" %d", a[i]);
		}
	}
}

실행 결과)

'정렬' 카테고리의 다른 글

트리 정렬(Tree Sort)  (0) 2021.04.02
힙 정렬(Heap Sort)  (0) 2021.04.02
병합 정렬(Merge Sort)  (0) 2021.04.02
셸 정렬(Shell Sort)  (0) 2021.04.02
삽입 정렬(Insert Sort)  (0) 2021.04.02