Algorithm

Radix Sort (기수 정렬)

주인장 꼬비 2022. 8. 20. 15:33

Radix Sort(기수정렬)

-> 다른 정렬알고리즘 처럼 두 수의 크기로 비교하는 것이 아니라, 자릿수로 비교하는 알고리즘 (버킷을 사용)

(1000 과 12323 를 비교했을때 1000은 4자리, 12323은 5자리 숫자 인 것으로 비교)

 

10진수니깐 버킷을 10개 (0~9 버킷) 으로 시작한다.

 

// number의 idx(자릿수)에 해당하는 숫자를 리턴
function getDigit(number, idx) {
  /**
   * Math.floor : 내림
   * Math.abs : 절대값 반환 : number가 음수인 경우일 때를 대비
   * Math.pow : 거듭제곱
   */
  return Math.floor(Math.abs(number) / Math.pow(10, idx)) % 10;
}

// 자릿수가 몇인지 확인
function digitCount(number) {
  // Math.log10 : 밑이 10인 로그의 값을 리턴
  return Math.floor(Math.log10(Math.abs(number))) + 1;
}

// 배열의 숫자중 자릿수가 가장 큰 경우엔 몇인지
function mostDigits(arr) {
  let max = 0;
  for (let num of arr) {
    max = Math.max(max, digitCount(num));
  }
  return max;
}

function radixSort(arr) {
  const maxDigit = mostDigits(arr);

  for (let idx = 0; idx < maxDigit; idx++) {
    // 길이가 10인배열을 만들고 그 하위로 또 배열을 만듬
    const digitBuckets = Array.from({ length: 10 }, () => []);
    for (let num of arr) {
      const digit = getDigit(num, idx);
      digitBuckets[digit].push(num);
    }
    arr = [].concat(...digitBuckets); // digitsBucket으로 새 배열을 만듬
  }
  return arr;
}

console.log(radixSort([12345, 56, 8, 32, 2020, 1, 442, 323, 143, 32]));

 

Radix Sort 의 Big O

n : 배열의 길이, k : 자릿수

Best : O(nk)

Average : O(nk)

Worst : O(nk)

Space Complexity : O(n+k)

 

Radix Sort 는 다른 정렬에 비해 빠를 수 있으나,

컴퓨터 메모리에 수를 저장하는 방식에 대한 제한으로 인해 실제로는 그렇지 않을 수 있다. 

'Algorithm' 카테고리의 다른 글

Singly Linked List (단방향 연결리스트)  (0) 2022.09.01
Class Method 간단 설명  (0) 2022.09.01
Quick Sort (퀵 정렬)  (0) 2022.08.14
Merge Sort (합병 정렬)  (0) 2022.08.07
Bubble Sort & Insertion Sort & Selection Sort 비교  (0) 2022.08.07