关于计数排序和桶排序的一点学习心得

计数排序

计数排序(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个桶吗? 这时候可以为了节省空间而略微牺牲下时间(因为桶排序需要二次排序) 去选择桶排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值