计数排序和基数排序

  1. 这两种排序方法的时间复杂度O(n), 不同于比较排序

  2. 计数排序

    1. 基本方法:
      新建辅助数组, 把原数组中的值对应的辅助数组索引处值计数, 利用索引的有序性对原数组进行排序
    2. 标记变量
    k  原数组中最大值+1
    
    1. 代码
    def counting_sort(arr, k):
      result = []
      # 辅助数组
      arr_temp = [0]*k
      # 遍历原数组, 元素值对应的辅助数组索引处值+1
      for i in arr:
        arr_temp[i] += 1
      # 累加求和
      # 为什么不直接遍历辅助数组, 通过值来还原排序的数组?
      # for i in range(k):
      #  while arr_temp[i] > 0:
      #    result.append(i)
      #    arr_temp[i] -= 1
      for i in range(k):
        if i > 0:
          arr_temp[i] = arr_temp[i] + arr_temp[i-1]
      # 还原排序的数组
      for i in range(len(arr)-1, -1, -1):
        # 原数组中值, 是辅助数组的索引, 假设辅助数组索引处的值n
        # 它是自身和比自身小的数字数量, 即结果数组中第n位
        result[arr_temp[arr[i]] - 1] = arr[i]
        arr_temp[arr[i]] -= 1
    
    1. 适合有上限, 分布集中的整数数组
  3. 基数排序

    1. 基本方法:
      根据数字的每一位进行排序. 利用该位上的值, 将其放入0-10数组中, 使其从局部有序到整体有序.
    2. 标记变量:
    radix 进制
    k  最大位数
    
    1. 代码:
    import math
    
    def  sort(a, radix=10):
      result = [[] for i in range(radix)] 
      # 最大位数
      k = math.ceil(math.log(max(a), radix))
      for i in range(k):
         for j in a:
          # 解析每个数该位上的数字
           num = j % 10**(i + 1) // 10**i
           result[num].append(j)
          # 清空原数组
         del a[:]
        for j in result:
          a.extend(j)
    
  4. 共同点:
    利用映射关系, 将待排序中数组的值映射到辅助数组的索引上, 再通过索引的有序进行还原.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,221评论 0 4
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 682评论 0 0
  • 酷安的原logo为绿底白章,但像上图一般多彩的logo在其“酷图”板块却时常出现,这多元化的标志正映衬出这一脱离传...
    左手撑伞阅读 5,026评论 1 2
  • 是不是人与人之间的相处必经历一段时间的厌恶呢?在我而言,我想这是必经历的。在与人相处过程中,会发现对方很多...
    冯小九tianbao阅读 196评论 0 0
  • 11108-糖朵朵 月光下,一颗小小的蛋躺在叶子上。星期天早上,一条有小又饿的毛毛虫从蛋里爬了出来,他去找一些东西...
    ET糖朵朵阅读 703评论 0 0