데이터 구조 및 알고리즘 - 기수 정렬
숫자의 자릿수가 더 많으면 더 큰 숫자입니다. 300은 3자리(3,0,0)이고 95는 2자리(9,5)이므로 300이 95보다 크다는 것을 숫자를 기준으로 안전하게 가정할 수 있습니다. 이것이 작동하는 방식(지금은 소수가 아닌 기본 10 숫자용임)은 0-9까지 10개의 "버킷"이 있고 마지막(가장 오른쪽) 숫자를 기준으로 각 버킷에 숫자를 배치하는 것입니다. 버킷 내에서 정렬하지 않고 그냥 버킷에 배치합니다. 그런 다음 버킷 순서에 따라 목록에 다시 배치하므로 9가 1000보다 작더라도 가장 오른쪽 숫자가 0인 경우 1000이 첫 번째가 됩니다. 이제 오른쪽에서 두 번째 숫자를 기준으로 프로세스가 반복됩니다. . 오른쪽에서 두 번째 숫자가 없는 숫자, 예를 들어 9는 오른쪽에서 두 번째 숫자가 0이므로 0 버킷에 배치됩니다. 가장 큰 값에 도달할 때까지 이 프로세스를 계속 반복합니다. 이 과정을 반복하는 횟수는 가장 큰 자릿수 숫자만큼입니다.
. 다음은 진행 상황을 보여주는 예입니다.
기수 정렬을 구현하려면 이전과 마찬가지로
pivot
, swap
, merge
등 몇 가지 도우미 함수를 작성해야 합니다. 작성해야 하는 도우미 함수 중 하나는 메서드입니다. 주어진 장소에서 숫자의 숫자를 반환합니다. 따라서 getDigit(number, place)
다음 결과를 예상할 수 있습니다.getDigit(93824, 0); //4
getDigit(93824, 1); //2
getDigit(93824, 2); //8
getDigit(93824, 3); //3
getDigit(93824, 4); //9
이것에 대한 힌트 힌트 바퀴를 재발 명할 이유가 없습니다. Stackoverflow에는 많은 솔루션이 있으며 다음은 그 중 하나입니다.
function getDigit(number, place) {
return Math.floor(Math.abs(number) / Math.pow(10, place)) % 10;
}
우리가 만들어야 할 다음 도우미 메서드는 숫자에 몇 개의 자릿수가 있는지입니다. 왜요? 가장 큰 것은 버킷으로 정렬/재주문할 횟수를 결정하는 방법이기 때문입니다. 이것을
digitCount(number)
라고 부르면 Stackoverflow에서 더 훌륭한 코드를 얻을 수 있습니다.function digitCount(number) {
if(number === 0) return 1;
return Math.floor(Math.log10(Math.abs(number))) + 1;
}
생성할 마지막 메서드는 주어진 숫자 배열이 해당 배열에서 가장 큰 값
digitCount
을 반환하는 메서드이며 보시다시피 이전에 정의한 메서드를 사용할 것입니다. Math.max(num1, num2)를 사용하여 최대값을 비교하고 반환할 수 있습니다. 시작합니다:function mostDigits(numbers) {
let maxDigits = 0;
for(let i = 0; i < numbers.length; i++) {
maxDigits = Math.max(maxDigits, digitCount(numbers[i]));
}
return maxDigits;
}
실제 기수 정렬의 경우 다음이 필요합니다.
mostDigits()
) Radix Sort .
Reference
이 문제에 관하여(데이터 구조 및 알고리즘 - 기수 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bradisrad83/data-structures-and-algorithms-radix-sort-4pdm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)