计数排序需要用到另一个数据结构:哈希表
- 首先遍历一次无序的数组,把数组元素和它出现的次数以键值对的形式存进哈希表中。同时,在遍历数组的同时,保存下数组的最大值进max。然后原数组就没用了。
- 第二步,因为max是数组元素的最大值,(我们默认对正整数排序),所以从0遍历到max,这之中一定会包含进所有的数组元素。遍历的时候,如果这个值在哈希表中,那就把它push进新数组,因为这个值不知道出现几次,所以还要用一个for循环,这个值出现几次,就push进新数组几次。
let countSort=arr =>{
let max=0,hash={},result=[]
for(let i=0;i<arr.length;i++){
if (arr[i] in hash){
hash[arr[i]]+=1
}else{
hash[arr[i]]=1
}
if (arr[i]>max){max=arr[i]}
}
for (let j=0;j<=max;j++){
if (j in hash){
for (let z=0;z<hash[j];z++){
result.push(j)
}
}
}
return result
}
时间复杂度:n+max(这里我们默认数组元素全是正整数,而且最小从0开始)
如果知道数组的最小值min,时间复杂度是n+max-min