计数排序(Counting Sort)

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。就是遍历数组记录数组下的元素出现过多次,然后把这个元素找个位置先安置下来,简单点说就是以原数组每个元素的值作为新数组的下标,而对应小标的新数组元素的值作为出现的次数,相当于是通过下标进行排序。

首先我们要对计数排序有一个正确的认识,计数排序是用于确定范围的整数的线性时间排序算法,这一句话我们就可以知道计数排序该如何用了.

处理数据:确定范围内的整数
特点:快(线性时间)

其数据如下:

最佳情况:T(n) = O(n+k)
最差情况:T(n) = O(n+k)
平均情况:T(n) = O(n+k)

计数排序的步骤如下

  1. 查找待排序数组中最大和最小的元素

  2. 统计每个值为i的元素的出现次数

  3. 对所有计数开始累加(从min开始,每一项和前一项相加)

  4. 反向填充目标数组,将每个元素i放在新数组的第C[i]项,每放一个元素,计数-1.

JS代码如下:

function countingSort(arr, maxValue) {
var bucket = new Array(maxValue+1),
sortedIndex = 0;
arrLen = arr.length,
bucketLen = maxValue + 1;

for (var i = 0; i < arrLen; i++) {
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
}

for (var j = 0; j < bucketLen; j++) {
while(bucket[j] > 0) {
arr[sortedIndex++] = j;
bucket[j]--;
}
}

return arr;
}
var arr = [2, 3, 8, 7, 1, 2, 7, 3];
console.log(countingSort(arr,8));//1,2,2,3,3,7,7,8

链接: https://www.fly63.com/course/28_1299