Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript计数排序实现_Javascript_Algorithm_Counting Sort - Fatal编程技术网

Javascript计数排序实现

Javascript计数排序实现,javascript,algorithm,counting-sort,Javascript,Algorithm,Counting Sort,这是在Javascript中实现计数排序的好方法还是最好的方法? 找不到标准JS计数排序示例 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

这是在Javascript中实现计数排序的好方法还是最好的方法? 找不到标准JS计数排序示例

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]
函数计数排序(arr){
var helper=[];//此helper将记录每个数字在arr中出现的次数
//由于JS arrary是一个对象,并且元素不是连续存储的,所以helper的空间复杂度小于n
对于(var i=0;i0){
newArr.push(parseInt(i));
助手[i]-;
}
}
返回newArr;
}
var-arr=[5,4,3,2,1,0];
console.log(countingSort(arr));//[0, 1, 2, 3, 4, 5]

代码是正确的,并附有一些注释:

  • 一般来说,不鼓励在数组上使用
    for..In
    ,但除非您在数组原型上定义可枚举属性(这是一个坏主意),否则您可以使用它

  • 您可以改进循环多次推送相同值的部分。这可以通过连接
    数组(helper[i])以“一次”的方式完成。将(i)
    填充到结果中

您还可以使用
reduce
使函数更具有功能性编程风格。在极端情况下,它可能是这样的:

函数计数排序(arr){
返回arr.reduce((acc,v)=>(acc[v]=(acc[v]|0)+1,acc),[])
.reduce((acc,n,i)=>acc.concat(数组(n).fill(i)),[]);
}
//样本运行:
var-arr=[5,4,3,2,1,0];

console.log(countingSort(arr));//[0,1,2,3,4,5]
计数排序是通过初始化长度为k的辅助数组开始的,该数组将保存每个数字的计数。每个索引的初始值为0。之后,循环输入数组,每次遇到数组中的数字时,将每个值的“计数”增加1。现在,辅助数组保存每个元素在输入数组中的次数。最后一步是从最小值循环到最大值。在这个循环中,您将循环计数数组中的每个对应值,并按顺序将计数大于0的元素添加到数组中。通过使用第二个递增变量添加每个项(例如,如果我们使用“i”从最小值循环到最大值,那么我们将使用“j”在数组中循环),然后增加第二个递增变量,以便将下一个项放在下一个最高的数组索引中,最后,减少count数组中当前项的值,这样就不会添加太多的元素

const countingSort=(arr、min、max)=>{
常量计数={};
//首先填充count对象
对于(设i=min;i
const countingSort=(arr,min,max)=>{
让计数器=[…数组(max+1)].map(e=>0);
让结果=[]
for(设i=min;i
,并链接到至少一个JS实现。在结果的第一个链接中为我提供了一个JS实现。很酷,这也是这里唯一一个不依赖Javascript对象中的数字键在迭代时排序的实现。(虽然人们通常可以在较新的环境中依赖这种怪癖,但在这样的算法中使用它对我来说有点像作弊,因为算法最重要的部分,即密钥排序,是由解释器在幕后完成的,而不是由代码编写者的编程实现完成的。)此算法输出错误。需要先准备直方图,请参阅
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
}