본문 바로가기

플밍 is 뭔들/자료구조

07-7 기수 정렬

※ 기수정렬(Radix Sort)
 - 분배 방식의 정렬 방법
 - 정렬할 원소의 키값에 해당하는 버킷(bucket)에 원소를 분배하였다가 버킷의 순서대로 원소를 꺼내는 방법을 반복
 - 원소의 키를 표현하는 값의 기수(radix)만큼의 버킷이 필요하고, 키값의 자리수만큼 기수 정렬을 반복한다.
 - 10진수로 표현된 키값을 가진 원소들을 정렬할 때에는 0~9까지의 10개의 버킷을 이용
 - 키값의 일의 자리에 대해 기수 정렬을 수행하고 그 다음 십의 자리에 대해 기수 정렬을 하고 그 다음 백의 자리에 대해 기수정렬을 하고.... 자리수에 맞게 반복한다.
 - 버킷은 원소들을 순서대로 꺼내어 다음 단계의 기수 정렬을 수행해야 하므로 큐를 사용하여 만든다.


※ 구현

Radix Sort
public class RadixSort {
       Queue[] ql = new Queue[10];
       int[] result;
       int placeValue =1;
       
       public RadixSort(){
              Queue<Integer> q0 = new LinkedList<Integer>();
              Queue<Integer> q1 = new LinkedList<Integer>();
              Queue<Integer> q2 = new LinkedList<Integer>();
              Queue<Integer> q3 = new LinkedList<Integer>();
              Queue<Integer> q4 = new LinkedList<Integer>();
              Queue<Integer> q5 = new LinkedList<Integer>();
              Queue<Integer> q6 = new LinkedList<Integer>();
              Queue<Integer> q7 = new LinkedList<Integer>();
              Queue<Integer> q8 = new LinkedList<Integer>();
              Queue<Integer> q9 = new LinkedList<Integer>();
              
              ql[0] = q0;
              ql[1] = q1;
              ql[2] = q2;
              ql[3] = q3;
              ql[4] = q4;
              ql[5] = q5;
              ql[6] = q6;
              ql[7] = q7;
              ql[8] = q8;
              ql[9] = q9;
       }
       
       public void sorting(int a[]){
              
              if(result ==null){
                     result = a;
              }
              
              int resultIdx =0;
              
              for(int i =0; i<a.length; i++){
                     if(placeValue ==1){
                           int element = result[i]%10;
                           ql[element].add(result[i]);
                     }else{
                           int element = result[i]/placeValue;
                           ql[element].add(result[i]);
                     }
              }
              
              //breaking point
              if(ql[0].size() == result.length){
                     return;
              }
              
              for(int i =0; i<10; i++){
                     while(ql[i].size() != 0){
                           result[resultIdx] = (int) ql[i].poll();
                           resultIdx++;
                     }
              }
              
              placeValue *= 10;
              
              printRadixSort();
              
              sorting(result);
       }
       
       public void printRadixSort(){
              System.out.print("\n정렬된 원소 : ");
              for(int i=0; i <result.length; i++){
                     System.out.print(result[i]+" ");
              }
              System.out.println();
       }
}

Main
public class Main {
       public static void main(String[] args) {
              
              int a[] = {69,10,30,2,16,8,31,22};
              RadixSort rs = new RadixSort();
              System.out.println("\n정렬할 원소 : ");
              for(int i =0; i<a.length; i++){
                     System.out.printf(" %d ", a[i]);
              }
              System.out.println();
              rs.sorting(a);
       }
}


'플밍 is 뭔들 > 자료구조' 카테고리의 다른 글

07-9 트리 정렬  (0) 2016.11.30
07-8 힙 정렬  (0) 2016.11.30
07-6 병합 정렬  (0) 2016.11.30
07-5 셸 정렬  (0) 2016.11.30
07-4 삽입 정렬  (0) 2016.11.30