排序算法---计数排序

计数排序是一种非比较性质的排序算法,元素从未排序状态到排序状态的过程,是由额外空间的辅助和元素本身的值决定的。

计数排序中没有元素之间的比较和交换操作,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算确定每个元素最终的位置。

算法过程

  • 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;
  • 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
  • 对额外空间内数据进行计算,得出每一个元素的正确位置;
  • 将待排序集合每一个元素移动到计算得出的正确位置上。

实例

待排序集合:[ 2,3,0,5,2,-1]

第一步

最大值:max=5,最小值:min=-1,所以可以申请的额外空间大小为:k=max-min+1=5+1+1=7.

第二步

将待排序集合中的每一个元素记录到额外空间中,例如,元素2,对应的记录位置下标为:index=2-min=3

结果为:

times1102101
value-1012345

 

记录的times次数,确定了该元素在集合中出现了几次。

第三步

将每个元素的次数更新为该元素次数加上前一个元素的次数之和。

因为额外空间中的元素是有序排列的,也就是说额外空间中的每个元素的最终位置都是在前一个元素的后面。

times1224556
value-1012345

 

第四步

根据已经确定的元素序列,移动到已排序集合中。

性能分析

  • 时间复杂度:

    第一个循环用于在额外空间中记录每一个元素出现的次数,复杂度为o(N) ;第二个循环用于计算每一个元素的最终位置,复杂度为o(K)K 为申请的额外空间大小;第三个循环用于移动待排序集合中元素到已排序集合的正确位置上,复杂度为 o(N)。所以时间复杂度为o(N+K).

  • 空间复杂度:o(N+K)

  • 稳定性:稳定,相对次序不变

python代码

class Solution:
    def count_sort(self,nums:list):
        max_nums = max(nums)
        min_nums = min(nums)
        k = max_nums - min_nums + 1
        ras = [0 for i in range(0,k)]
        result = [ 0 for j in range(len(nums))]
        for j in nums:
            ras[j - min_nums] += 1
        for j in range(1,k):
            ras[j] += ras[j-1]
        for t in range(len(nums)-1,-1,-1):
            countIndex = nums[t] - min_nums  #index
            result[ras[countIndex]-1] = nums[t] #减一是因为result从0开始的
            ras[countIndex] -= 1
        return result
s = Solution()
nums=[1,3,5,3,4,5,3,2,1]
print(s.count_sort(nums))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值