기수 정렬

기수 정렬에 대해 무엇을 이해합니까?
  • 안정적인 정렬 알고리즘
  • 원래 어레이를 변형함
  • 비교 정렬이 아님
  • 숫자가 해석되는 방식을 이용하여 정렬
  • Array에 양수만 포함된 경우 대부분 구현됨
  • 10개의 서로 다른 양의 정수(0 - 9)만 존재할 수 있습니다.

  • 각 루프 결과는 Array<Array<Int>>
  • 버킷 정렬과 유사한 개념

  • 2개의 중첩된 for 루프 사용
  • 먼저 도우미 함수 2개를 만듭니다.
  • getMaxNumOfDigits()
  • getDigitByPos()

  • 다음으로 메인 함수에서
  • 외부 루프가 MaxNumOfDigits에서 끝납니다.
  • 각 루프에서 10개의 새 버킷 초기화(크기 10의 어레이)

  • 배열의 총 요소 수를 통해 내부 루프가 반복됩니다.
  • 버킷 위치에는 위치별로 해당 숫자의 값이 푸시된 내부 배열이 있습니다
  • .

  • 배열의 배열을 병합하고 원래 배열에 다시 할당합니다
  • .


  • 시간 및 공간 복잡성은 계수 정렬
  • 과 완전히 반대입니다.
  • 시간 복잡도
  • 최고는 O(nk)
  • 평균은 O(nk)
  • 최악은 O(nk)

  • 공간 복잡성
  • O(n+k)


  • function getMaxNumOfDigits(arr) {
        const max = Math.max(...arr);
        if (max === 0) return 1;
        // suggest to just memorise this if can't think of the math on the spot
        // else just use stringify and get length of string
        return Math.floor(Math.log10(max)) + 1;
    }
    function getDigitByPos(num, pos) {
        if (num === 0) return 0;
        // e.g.
        // num = 1234, pos = 2
        // floor(1234 / 10^2) % 10
        // floor(1234 / 100) % 10
        // = 12 % 10
        // = 2
        return Math.floor(num / Math.pow(10, pos)) % 10;
    }
    
    function RadixSort(arr) {
        const arrLength = arr.length;
        const maxNumOfDigits = getMaxNumOfDigits(arr);
    
        for(let i = 0; i < maxNumOfDigits; i++) {
            const digitsBucket = new Array(10);
    
            for (let j = 0; j < arrLength; j++) {
                const digit = getDigitByPos(arr[j], i);
                if (!digitsBucket[digit]) {
                    digitsBucket[digit] = [];
                }
                digitsBucket[digit].push(arr[j]);
            }
    
            arr = digitsBucket.flat();
        }
    
        return arr;
    }
    

    좋은 웹페이지 즐겨찾기