Skip to content

Latest commit

 

History

History
71 lines (62 loc) · 2.35 KB

기수정렬.md

File metadata and controls

71 lines (62 loc) · 2.35 KB

기수 정렬(radix sort)

  • 기수 정렬도 빠르고, 자릿수를 비교해서 정렬하는 방식이다. 그래서 단점이라면 자릿수가 없는 것들은 정렬할 수 없다.
  • 시간 복잡도는 O(kn)이다.는 가장 큰 숫자의 자릿수이고, n은 입력 배열의 크기이다. ex) 가장 큰 수가 10000이면 자릿수는 5니까 O(5n)가 된다.

동작 예시

[125, 383, 274, 96, 0, 9, 81, 72][0], // 1의 자리수를 기준으로 정렬합니다.
  [81],
  [72],
  [383],
  [274],
  [125],
  [96],
  [9][
    // 10의 자리수를 기준으로 정렬합니다. 0이나 9 같은 것은 10의 자리수가 0이라고 생각하시면 됩니다.
    (0, 9)
  ],
  [125],
  [72, 274],
  [81, 383],
  [96][
    // 100의 자리수를 기준으로 정렬합니다.
    (0, 9, 72, 81, 96)
  ],
  [125, 274, 383];
// 정렬 끝

구현

let counter = [[]];
let radixLSD = function (array, k) {
  let mod = 10;
  for (let i = 0; i < d; i++, mod *= 10) {
    // mod는 현재 정렬 중인 자리수를 나타내는 것으로 10부터 해서 100, 1000, ...으로 커집니다.
    for (let j = 0; j < array.length; j++) {
      let bucket = parseInt(array[j] % mod); // 같은 그룹으로 묶일 나머지를 나타내는 부분입니다.
      if (counter[bucket] == null) {
        counter[bucket] = [];
      }
      counter[bucket].push(array[j]); // 나머지 별로 묶어줍니다.
      console.log("bucket", bucket, counter[bucket]);
    }
    console.log(counter.slice(0));

    let pos = 0;
    for (let j = 0; j < counter.length; j++) {
      // counter에 저장한 묶음들(나머지 순서로 정렬됨)을 실제 배열에 반영해줍니다.
      let value = null;
      if (counter[j] != null) {
        while ((value = counter[j].shift()) != null) {
          array[pos++] = value;
        }
      }
    }
    console.log(array);
  }
  return array;
};
radixLSD([125, 383, 274, 96, 0, 9, 81, 72], 3); // [0,9,72,81,96,125,274,383]

참고