티스토리 뷰

알고리즘

Sort - (3) Merge, Radix Sort

조용한스택 2021. 12. 22. 00:44
  • Merge Sort
    • 여러 부분 집합으로 분할하고, 정렬한 후, 병합하는 방식
    • 종류
      • 2-way: 2개의 정렬된 자료 집합을 하나의 집합으로 병합
      • n-way: n개의 정렬된 자료 집합을 하나의 집합으로 병합
    void merge(int arr[], int begin, int middle, int end) {
       int *sorted = new int[end - begin + 1];
    
       int i = 0;
       int left = begin;
       int right = middle + 1;
       while(left <= middle && right <= end) {
          if(arr[left] < arr[right]) sorted[i++] = arr[left++];
          else sorted[i++] = arr[right++];
       }
    
       while(left <= middle)
          sorted[i++] = arr[left++];
       while(right <= end)
          sorted[i++] = arr[right++];      
       for(i = 0; i <= end - begin; i++)
          arr[begin + i] = sorted[i];
       delete sorted;
    }
    
    void sort(int arr[], int begin, int end) {
       if (end <= begin) return;
    
       int middle = (begin + end)/2;
       sort(arr, begin, middle);
       sort(arr, middle + 1, end);
    
       merge(arr, begin, middle, end);
    
    }
    
  • RadixSort
    • 원소의 키 값을 나타내는 인덱스를 이용한 정렬 방법. 정렬할 원소의 키 값에 해당하는 bucket에 원소를 분배하였다가 버킷의 순서대로 원소를 꺼내는 방법
    class RadixSort {
    private:
        int length;
        vector<vector<int>> counter;
    
    public:
        RadixSort(int size) {
            length = size;
            counter.resize(10);
        }
    
       void sort(int arr[]) {
          int max = 0;
          for(int i = 0; i < length; i++)
             if(max < arr[i]) max = arr[i];
          string maxstr = max+"";
          int max_digit = maxstr.length();
          sort(arr, max_digit);
       }
    
       void sort(int arr[], int max_digit) {
           int mod = 10, div = 1;
    
           for(int i = 0; i < max_digit; i++, div *= 10, mod *= 10) {
               for(int j = 0; j < length; j++) {
                   int bucket = arr[j] % mod / div;
                   counter[bucket].push_back(arr[j]);
               }
               int pos = 0;
               for(vector<int> elem : counter){
                   for(int value : elem) arr[pos++] = value;
               }
           }
       }
    
    };
    

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

[leetcode] Number of Good Paths  (0) 2023.01.15
Sort - (2) Quick, Heap Sort  (0) 2021.12.22
Sort - (1) Bubble, Selection, Insertion, Shell  (0) 2021.12.22
Sort - Intro  (0) 2021.12.22
[코딩테스트 log]보석 쇼핑  (0) 2021.07.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함