《计数排序》

145 阅读1分钟

计数排序需要用到另一个数据结构:哈希表

  1. 首先遍历一次无序的数组,把数组元素和它出现的次数以键值对的形式存进哈希表中。同时,在遍历数组的同时,保存下数组的最大值进max。然后原数组就没用了。
  2. 第二步,因为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