OK,最后再说一种排序,这一个篇章就结束了。
说到桶排序,它的思想就是把分治用到极致,把一个序列分为一个个同,然后对每个桶进行排序,最后再进行整合。
我们还是先用图解来进行对原理的解释,然后再用代码实现。
OK,桶排序的思想有了,我们来说一下原理:
第一步:确定这个序列要分为几个桶
第二步:把每个元素放到对应的桶里面
第三步:对每个桶进行排序
第四步:对所有的桶进行整合
现在我们用图来看一下,倘若我有这样一个序列
现在我们要确定桶的数量,如和确定呢,这里面有一个计算公式
桶的数量 = (最大值 - 最小值)/ 数组长度 + 1。
那这里面我们可以确定桶的数量为 49 / 13 +1 = 4;
现在我们再用另一个公式确定每个元素在哪个桶中
元素位置 =( 元素大小 - 最小值)/ 数组长度
OK,根据这个公式我们可以确定每个元素都在第几个桶里面
OK,现在我们再对每一个桶进行排序(这里面没有固定的排序算法)
对每个桶进行排序后最后我们进行整合,就变成了一个有序的序列。
OK,现在我们再用代码来实现一下:
<script>
function bucketSort(arr){
let max = Math.max(...arr);
let min = Math.min(...arr);
let bucketNum = parseInt((max - min) / arr.length) + 1;
let bucketArr = new Array(bucketNum);
for(var i=0;i<bucketNum;i++){
bucketArr[i] = new Array();
}
for(var i of arr){
let num = parseInt((i-min) / arr.length);
bucketArr[num].push(i);
}
for(var i of bucketArr){
i.sort();
}
let k = 0;
for(var i=0;i<bucketArr.length;i++){
for(var j=0;j<bucketArr[i].length;j++){
arr[k++] = bucketArr[i][j];
}
}
}
let arr = [1,20,31,58,46,5,6,7,21,32,44,59];
bucketSort(arr);
console.log(arr);
</script>
OK,关于桶排序,以及八个排序算法,也就全部都说完了!