0

While working on Radix sort of integers, new Array(10).fill([]) and Array.from({length: 10}, () => []) both create an array of 10 subarrays, but new Array(10).fill([]) returns a bad result in the context of the radixSort function.

Can someone explain why these two code snippets return wildly different results?

Bad version using Array(10).fill([])


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

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

function mostDigits(arr){
    let largest = 0;
    for (let i = 0; i < arr.length; i++)
        if (digitCount(arr[i]) > largest) 
            largest = digitCount(arr[i]);
            
    return largest;
}

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

function radixSort(nums){
    let digits = mostDigits(nums);
    
    for (let k = 0; k < digits; k++){
        
        let buckets = new Array(10).fill([]);
        
        for (let i = 0; i < nums.length; i++){
            let number = nums[i];
            buckets[getDigit(number, k)].push(number);
        }
        
        nums = buckets.flat();
    }
    
    return nums;
}

radixSort([4, 2, 989, 400, 1900])


Good version using Array.from({length: 10}, () => [])


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

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

function mostDigits(arr){
    let largest = 0;
    for (let i = 0; i < arr.length; i++)
        if (digitCount(arr[i]) > largest) 
            largest = digitCount(arr[i]);
            
    return largest;
}

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

function radixSort(nums){
    let digits = mostDigits(nums);
    
    for (let k = 0; k < digits; k++){
        
        let buckets = Array.from({length: 10}, () => []);
        
        for (let i = 0; i < nums.length; i++){
            let number = nums[i];
            buckets[getDigit(number, k)].push(number);
        }
        
        nums = buckets.flat();
    }
    
    return nums;
}

radixSort([4, 2, 989, 400, 1900])


I expected both of these to work the same since they both create an array with 10 subarrays. I can't find anything online about why they might behave differently.

2
  • constant value vs dynamic new array. Commented Nov 4, 2022 at 18:37
  • 1
    fill([]) is setting it with the same array in every index. It is not a new array in every index. Commented Nov 4, 2022 at 18:38

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.