Kimsora✨
article thumbnail
Published 2023. 3. 23. 17:18
기수정렬 (Radix Sort) 알고리즘
320x100
반응형
기수정렬
기수정렬은 비교 연산을 하지 않으며 정렬 속도가 빠르지만, 데이터 전체 크기에 기수 테이블의 크기만한 메모리가 더 필요하다.
가장 큰 자릿수를 D라고 했을 때 0(DN)의 시간 복잡도를 가진다

=>기수 정렬을 사용하기 위해선 데이터의 값들이 동일한 길이를 가지는 숫자나 문자열로 구성되어 있어야 한다.

 

📌num의 i번째 자리에 있는 수를 반환  코드

function getDigit(num, i) {
  return Math.floor(Math.abs(num) / Math.pow(10, i)) % 10;
}

 

📌num의 자리 수를 반환 코드

function digitCount(num) {
  if (num === 0) return 1;
  return Math.floor(Math.log10(Math.abs(num))) + 1;
}

 

📌 입력된 숫자들 중 가장 큰 자리수 반환 코드

function mostDigits(nums) {
  let maxDigits = 0;
  for (let i = 0; i < nums.length; i++) {
    maxDigits = Math.max(maxDigits, digitCount(nums[i]));
  }
  return maxDigits;
}

 

🧩이중 반복문을 통한 기수정렬

function getDigit(num, i) {
  return Math.floor(Math.abs(num) / Math.pow(10, i)) % 10;
}

function digitCount(num) {
  if (num === 0) return 1;
  return Math.floor(Math.log10(Math.abs(num))) + 1;
}

function mostDigits(nums) {
  let maxDigits = 0;
  for (let i = 0; i < nums.length; i++) {
    maxDigits = Math.max(maxDigits, digitCount(nums[i]));
  }
  return maxDigits;
}

function radixsort(nums) {
//가장큰 자리수 만큼 반복문 돌리기
  let maxDigitCount = mostDigits(nums);
  for (let k = 0; k < maxDigitCount; i++) {
  //별도의 메모리 공간 만들기
    let digitbuckets = Array.from({ length: 10 }, () => []);
    for (let i = 0; i < nums.length; i++) {
    //i번째 자리에 있는 수를 가져와서 키값으로 만들어준다 
      let digit = getDigit(nums[i], k);
    // digit번째의 메모리공간에 값을 넣어준다 
      digitbuckets[digit].push(nums[i]);
    }
    nums = [].concat(...digitbuckets);
  }
  return nums;
}
728x90
반응형

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

다익스트라 (Dijkstra)  (6) 2023.03.31
[자료구조]Tree  (0) 2022.12.14
Greedy Algorithm/Dynamic Programming  (2) 2022.12.09
시간복잡도/공간복잡도  (0) 2022.12.09
정렬 알고리즘  (0) 2022.11.30
profile

Kimsora✨

@sorarar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그

WH