计数排序
计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组 C ,其中第 i 个元素是待排序数组 A 中值等于 i 的元素的个数。然后根据数组 C 来将 A 中的元素排到正确的位置
当输入的元素是n个 0 到 k 之间的整数时,它的运行时间是 (n+k);
算法的步骤如下:
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为 i的元素出现的次数,存入数组 C 的第 项
- 对所有的计数累加 C 中的第一个元素开始,每一项和前一项相加
function countSort(arr){
//1 找到arr中的最大值
let max = findMax(arr);
//2 准备max个桶
let bucketArr = [];
for(let m = 0; m < max+1; m++){
bucketArr[m] = 0;
}
//3 入桶
for(let i = 0,len = arr.length; i < len; i++){
bucketArr[arr[i]] += 1;
}
//4 出桶
let outArray = [];
for(let j = 0,len = bucketArr.length; j < len; j++){
if(bucketArr[j] > 0){
for(let k = 0; k < bucketArr[j]; k++){
outArray.push(j)
}
}
}
return outArray;
}
function findMax(arr){
let k = 0;
for(let i = 1,len = arr.length; i < len; i++){
if(arr[i] > arr[k]){
k = i;
}
}
return arr[k]
}
复制代码
桶排序
桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来。
排序过程:
- 假设待排序的一组数统一的分布在一个范围中,并将这一范围划分成几个子范围,也就是桶
- 将待排序的一组数,分档规入这些子桶,并将桶中的数据进行排序
- 将各个桶中的数据有序的合并起来
二者比较
- 计数排序 不支持负数和小数(why?beause: 3。1415926 怎么存?难道要用数不清的桶去存每一位小数吗?)
- 当待排数组中出现较大值时(假如最大值为700,其他值都小于10)如何取舍?难道要用700个桶吗? 这时候可以为了节省空间而略微牺牲下时间(因为桶排序需要二次排序) 去选择桶排序