计数排序有四个步骤:
(1)首先会对每个输入进行频率统计,得到元素的频率表;
(2)然后将频率表转换为该元素的开始索引;
(3)根据各个元素的开始索引,将相同元素分类到临时数组中。
(4)最后将临时数组中的元素写回到原数组中。
1 /*计数排序*/ 2 function countingSort(arr) { 3 //找到最大最小值,计算差值 4 var max_num = Math.max.apply(Math,arr); 5 console.log("max:"+max_num); 6 var min_num = Math.min.apply(Math,arr); 7 console.log("min:"+min_num); 8 var len = max_num-min_num+1; 9 //计算频率 10 var count = new Array(len + 1); 11 count.fill(0); //填充0 12 for (let i = 0; i < arr.length; i++) { 13 //使用加1的索引,有重复的地方自增 14 count[arr[i]-min_num+1]++; 15 } 16 console.log("count:"+count); 17 //计算开始索引 18 for (let i = 0; i < count.length-1; i++) { 19 count[i+1] += count[i]; 20 } 21 console.log("count:"+count); 22 //元素按照开始索引分类,用到一个临时数组 23 var result = new Array(arr.length); 24 for (let i = 0; i < arr.length; i++) { 25 // 填充一个数据后,count[i]自增,以便相同的数据可以填到下一个空位 26 result[count[arr[i]-min_num]++] = arr[i]; 27 } 28 for (var i = 0; i < arr.length; i++) { 29 arr[i] = result[i]; 30 } 31 } 32 var arr = [3,2,5,4,6,1,9,5,3,0,1]; 33 countingSort(arr); 34 console.log(arr);
来源:https://www.cnblogs.com/daheiylx/p/9815481.html