How to sort an array efficiently

后端 未结 4 404
鱼传尺愫
鱼传尺愫 2021-01-28 01:46

I\'m trying to sort an array [3,3,2,1,3,2,2,2,1] to [1,1,3,3,3,2,2,2,2].

I\'m trying to handle it using object, using the number as key, and th

相关标签:
4条回答
  • 2021-01-28 02:25

    Try something like

    var curIndex = 0;
    for i in result {
       arr.fill(i, curIndex, curIndex + result[i]);
       curIndex = curIndex + result[i];
    }
    
    0 讨论(0)
  • 2021-01-28 02:31

    You could get the count for sorting the array.

    const sortNums = array => {
        const count = {};
        for (let v of array) count[v] = (count[v] || 0) + 1;
        return array.sort((a, b) => count[a] - count[b] || a - b);
    }
    
    console.log(sortNums([3, 3, 2, 1, 3, 2, 1]));

    An approach by using the object for sorting.

    const sortNums = array => {
        var count = {},
            result = {};
        for (let v of array) (count[v] = count[v] || []).push(v);
        for (let a of Object.values(count)) (result[a.length] = result[a.length] || []).push(a);
        return Object.values(result).flat(Infinity)
    }
    
    console.log(sortNums([3, 3, 2, 1, 3, 2, 1]));

    0 讨论(0)
  • 2021-01-28 02:40

    You can do this

    const sortNums = (arr) => {
        const result = {}
    
        for (let i = 0; i < arr.length; i++) {
          const num = result[arr[i]] || 0;
          result[arr[i]] = num + 1;
        }
    
        const a = [];
        for(let i = 0; i <= 9; i++) {
            if(result[i]) {
                a.push(...Array.from({length: result[i]}, x => i));
            }
        }
        return a;
      }
    
    0 讨论(0)
  • 2021-01-28 02:42

    Assuming that the numbers are small non-negative integers, you can count them as you have done already, and then generate the result on the fly when someone (Array.from() in this example) requests for it, with a simple pair of loops:

    function *sortNums(array){
      let stats=[];
      for(var i of array)
        stats[i]=(stats[i]||0)+1;
    
      for(let i=0;i<stats.length;i++)
        while(stats[i]>0){
          stats[i]--;
          yield i;
        }
    }
    
    console.log(Array.from(sortNums([3, 3, 10, 2, 1, 0, 3, 2, 1])).join());

    Of course it is possible to just collect the pieces into an array, in the direct, "traditional" way:

    let ret=[];
    for(let i=0;i<stats.length;i++)
      while(stats[i]>0){
        stats[i]--;
        ret.push(i);//yield i;
      }
    return ret;
    
    0 讨论(0)
提交回复
热议问题