桶排序:通常用于少量整数的排序,当然也可存在于类似map这种键和值可以类型相同的排序中。
需要排序的数组a,另一个长度为排序数组a元素最大值、每一个元素的初始值为0的数组b,通过循环遍历数组a,每当数组a的元素出现,该元素值所对应的b数组的下标,其元素值做加1。直到遍历完成,数组b元素的值就是下标对应的a数组的元素出现的次数。这种排序在做b数组下标输出时,还需判断次数是否为0.所以只适合以整数类型为元素的少量输出排序。注:其他类型数组可以考虑map这类集合作为b数组承载。
1 //桶排序 2 3 /** 4 * 主方法 5 * @param {*} arr 6 */ 7 function barrel_sort(arr) { 8 const NumberArr = [1, 3, 1, 6, 5, 5, 4, 8, 9, 9, 5]; 9 display(resolve_count(init_Array(NumberArr.length), NumberArr)); 10 } 11 12 /** 13 * 初始化所有值为0的一个数组,传入参数为数组长度 14 * @param {*} length 15 * @returns arr 16 */ 17 function init_Array(length) { 18 let arr = new Array(length); 19 return arr.fill(0); //填充数组并返回修改后的数组 20 } 21 22 /** 23 * 对每个只出现的次数作为对应桶的值 24 * @param {*} arr 桶数组 25 * @param {*} NumberArr 排序输出数组 26 */ 27 function resolve_count(arr, NumberArr) { 28 NumberArr.forEach(element => arr[element]++); //每个元素都会执行一次 29 return arr; 30 } 31 32 /** 33 * 对每个桶进行打印 34 * @param {*} arr 35 */ 36 function display(arr) { 37 arr.forEach((element, index) => { 38 while (element) { 39 console.log(index); 40 element--; 41 } 42 }); 43 }