计数排序
如下图:
原始数组:即需要进行排序的数组
计数数组:实现排序需求需要的中间数组
通过原始数组中寻找最大的元素,作为计数数组的长度进行创建数组
随后开始进行计数
最后再对计数素组进行遍历循环按下标获取元素,即可实现排序
贴代码~
function countSort(arr){
let maxValue = 0;
for(let i = 0; i< arr.length; i++){
if(maxValue < arr[i]){
maxValue = arr[i] //获取最大值
}
}
// 用数组最大值进行 计数数组的创建 +1 是因为数组是从0开始的
let bucket = new Array(maxValue + 1)
for(let i = 0; i < arr.length; i++){
let num = arr[i]
if(bucket[num] ==null){
bucket[num] = 1
}else{
bucket[num] += 1
}
}
let arrCurrIndex = 0;
//遍历计数素组
for(let i=0; i<bucket.length;i++){
//遍历计数素组 由于同一个数字的计数会大于1 所以对单个元素进行循环添加
while(bucket[i]>0){
let num =i
arr[arrCurrIndex++] = num;
bucket[i] -= 1
}
}
}
桶排序
桶排序是一种的计数排序衍生出来的方式
计数排序是对单个元素进行单个计数
那么桶排序是对单个元素通过对桶的大小进行放置,对大通进行元素大小比对塞入小桶后,对小桶内进行排序
贴代码~
function bucketSort(arr,bucketCount){
//bucketCount 每个桶里的元素的个数
let result = [],
minValue = arr[0],
maxValue = arr[0];
for(let i = 0; i < arr.length; i++){
if(arr[i] < minValue){
minValue = arr[i]
}
if(arr[i] > maxValue){
maxValue = arr[i]
}
}
// bucketSize 桶整个的大小
let bucketSize = Math.floor((maxValue - minValue)/ bucketCount) + 1
// 创建桶数组(计数素组)
let bucket = new Array(bucketSize)
for(let i = 0; i<bucket.length; i++){
bucket[i] = []
}
// 对每个元素进行桶分类(即将一个桶里应放buckerCount个元素)
for(let i = 0; i<arr.length; i++){
bucket[Math.floor((arr[i]-minValue)/bucketCount)].push(arr[i])
}
for(let i = 0; i<bucket.length;i++){
//这里对每个小桶 里的元素 进行插入排序
insetionSort(bucket[i])
for(let j = 0; j < bucket[i].length; j++){
result.push(bucket[i][j])
}
}
}
function insetionSort(arr){
let len = arr.length,prev,current;
for(let i = 1; i < len ; i++){
prev = i - 1
current = arr[i]
while( prev >=0 && arr[prev]>current){
arr[prev+1] = arr[prev]
prev -- ;
}
arr[prev+1] = current
}
}