Javascript计数排序实现

时间:2017-04-03 21:10:48

标签: javascript algorithm counting-sort

这是在Javascript中实现Counting Sort的好方法还是最好的方法? 找不到标准的JS Counting Sort示例。

function countingSort(arr){
  var helper = []; // This helper will note how many times each number appeared in the arr
                   // Since JS arrary is an object and elements are not continuously stored, helper's Space Complexity minor that n
  for(var i = 0; i<arr.length; i++){
    if(!helper[arr[i]]){
        helper[arr[i]] = 1;
    }else{
        helper[arr[i]] += 1;
    }
  }

  var newArr = []; 
  for(i in helper){
    while(helper[i]>0){
        newArr.push(parseInt(i));
        helper[i]--;
    }
  }
  return newArr; 
}

var arr = [5,4,3,2,1,0];
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5]

3 个答案:

答案 0 :(得分:1)

代码是正确的,有一些评论:

  • 一般情况下,不建议在数组上使用for..in,但除非你在Array原型上定义了可枚举的属性(无论如何这都是个坏主意),你对它的使用对我来说很好< / p>

  • 您可以多次改进循环到push相同值的部分。这可以通过将Array(helper[i]).fill(i)连接到结果来“完成”。

您还可以使用reduce使函数更多函数式编程样式。在极端情况下,它可能看起来像这样:

function countingSort(arr){
  return arr.reduce( (acc, v) => (acc[v] = (acc[v] || 0) + 1, acc), [] )
            .reduce( (acc, n, i) => acc.concat(Array(n).fill(i)), [] ); 
}

// Sample run:
var arr = [5,4,3,2,1,0];
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5]

答案 1 :(得分:0)

计数排序将从初始化长度为k的辅助数组开始,该数组将保存每个数字的计数。每个索引的初始值为0。此后,您遍历输入数组,每次在数组中遇到该数字时,将每个值的“计数”增加1。现在,辅助数组保存每个元素在输入数组中的次数。最后一步是从最小值循环到最大值。在此循环中,您将循环遍历count数组中的每个对应值,然后将count大于0的元素按顺序添加到该数组中。您可以通过使用第二个增量变量来添加每个项目(例如,如果我们使用“ i”从最小值到最大值循环,那么我们将使用“ j”在数组中循环),然后增加第二个增量变量因此,将下一项放置在数组的下一个最高索引中,最后减少计数数组中当前项的值,以免添加太多该值的元素。

let countingSort = (arr, min, max) => {
    let i = min,
        j = 0,
        len = arr.length,
        count = [];
    for (i; i <= max; i++) {
        count[i] = 0;
    }
    for (i = 0; i < len; i++) {
        count[arr[i]] += 1;
    }
    for (i = min; i <= max; i++) {
        while (count[i] > 0) {
            arr[j] = i;
            j++;
            count[i]--;
        }
    }
    return arr;
};

答案 2 :(得分:0)

const countingSort = (arr, min, max) => {
    
  let counters = [...Array(max+1)].map(e => 0);
  let result = []

  for(let i = min; i < max; i++){
      counters[arr[i]] += 1
  }
  
  for(let j = min; j <= max; j++){
    while( counters[j] > 0){
      result.push(j)
      counters[j]--
    }
  }
  
  return result
}