计数排序之算法

一、定义
计数排序几乎是唯一一个不基于比较的排序算法,作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数
二、算法思想
将输入的数据值转化为键存储在额外开辟的数组空间中。
三、具体实现

function countSort(arr) {
  var index = 0;
  var len = arr.length;
  var maxValue = Math.max.apply(null, arr); // 最大值
  var result = new Array(maxValue+1); // 结果数组

  // 把各个数组中对应的元素计数加一
  for(var i = 0; i < len; i++) {
    if(!result[arr[i]]) {
      result[arr[i]] = 0;
    }
    result[arr[i]]++;
  }
  // 按照计数的元素进行排序
  for(var j = 0; j < maxValue + 1; j++) {
    while(result[j] > 0) {
      arr[index++] = j;
      result[j]--;
    }
  }
  return arr;
}
console.log(countSort([53,115,9,72,11,6,3,19]));

四、效率分析
计数排序不改变相同元素之间原本相对的顺序,因此它是稳定的排序算法。
1、时间复杂度
最坏的情况:时间复杂度为O(n+k);
最佳的情况:时间复杂度为O(n+k);
平均来讲,时间复杂度为O(n+k)。

n表示数据规模,k表示桶的个数
2、空间复杂度
空间复杂度为常量O(k)。

转载于:https://www.cnblogs.com/camille666/archive/2013/04/05/countsort_fn.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值