**桶排序**
核心思想:对数据进行分桶(分组),分桶后对桶中数据进行排序(可以使用自己喜欢的方式),然后再将所有桶合并(数组合并)。
公式: 划分桶的数量 (数组中最大值-最小值)/数组长度+1
数据所属哪个桶 (数组中当前值-数组中最小值)/数组长度
let arr = [1,8,6,50,34,15,12,42,48,30,11]; let max = Math.max(...arr);//获取数组中最大数 let min = Math.min(...arr);//获取数组中最小数 let arrLength = arr.length;//数组长度 let bucketNum = Math.floor((max - min)/arrLength)+1;//分桶数量 let bucketArr = []; for(let j =0;j<bucketNum;j++){//循环生成桶 bucketArr.push([]); } for(let i =0;i<arr.length;i++){//遍历数据 let idx = Math.floor((arr[i]-min)/arrLength);//计算每个数据属于哪个桶 let flag = 1;//判断这条数据是否插入桶中,在比较的时候如果数组为空或者它是最大的数,就不会插入,我用来进行了判断 for(let k = 0;k<bucketArr[idx].length;k++){//遍历所属桶,与桶中数据进行比较,进行插入 if(bucketArr[idx][k]>arr[i]&&flag==1){ flag=2; bucketArr[idx].splice(k, 0, arr[i]); } } if(flag==1){ bucketArr[idx].push(arr[i]); } } let arr_=[] for(let j =0;j<bucketNum;j++){//对数组进行合并,你会发现对数据进行分桶后,每个桶中的数据后一个桶一定比前一个大,可以直接合并数组按照桶的顺序 arr_ = [...arr_,...bucketArr[j]]; } console.log(arr_,"arr_")
标签:arr,js,flag,let,数组,排序,Math From: https://www.cnblogs.com/lisir-blogshare/p/16664268.html