Fighting-算法-计数排序

本博客转自:https://blog.csdn.net/wardseptember/article/details/81434641
以下是本人自己理解,共勉!
"""
  计数排序--算法思想:

  假设要排序的数组为 nums = [1,0,3,1,0,1,1]
  结果输出:[0, 0, 1, 1, 1, 1, 3]

  1、首先求出nums的长度,最大值和最小值。
    nums_len = 7
    nums_max = 3
    nums_min = 0

  2、创建一个数组 counting_arr: 统计nums中每个元素的个数,
                counting_arr数组长度为 :nums_max+1-nums_min = 3+1-0=4
    统计nums中每个元素出现的次数,输出 counting_arr为:[2,4,0,1]
    比如:0的出现次数为2, 1出现次数为4, 2出现的次数为0, 3出现的次数为1.

  3、分别统计比0,1,3小的元素个数:如比0小(包括0)的元素有2个,如比1小(包括1)的元素有6个,如比3小(包括3)的元素有7个.
    更新counting_arr=[2,6,6,7]

  4、最后把在counting_arr中的记录按每个元素的计数展开到输出数组ordered中。
     举例:将nums = [1,0,3,1,0,1,1] 的元素根据counting_arr=[2,6,6,7]映射到ordered=[l0,0,0,0,0,0,0]中
     从nums的末尾开始遍历:
     执行这两句:  ordered[counting_arr[nums[i] - nums_min] - 1] = nums[i]
                 counting_arr[nums[i] - nums_min] -= 1
                 
         i=6时:  ordered[counting_arr[nums[6] - 0] - 1] = nums[6]
                 ordered[counting_arr[1] - 1] = 1
                 ordered[6-1] = 1
                 ordered[5] = 1
                 更新:  ordered=[l0,0,0,0,0,1,0]
                        counting_arr=[2,5,6,7]

         i=5时:  ordered[counting_arr[nums[5] - 0] - 1] = nums[5]
                 ordered[counting_arr[1] - 1] = 1
                 ordered[5-1] = 1
                 ordered[4] = 1
                 更新:    ordered=[l0,0,0,0,1,1,0]
                          counting_arr=[2,4,6,7]

         i=4时:  ordered[counting_arr[nums[4] - 0] - 1] = nums[4]
                 ordered[counting_arr[0] - 1] = 0
                 ordered[2-1] = 0
                 ordered[1] = 0
                 更新:    ordered=[0,0,0,0,1,1,0]
                          counting_arr=[1,4,6,7]

         i=3时:  ordered[counting_arr[nums[3] - 0] - 1] = nums[3]
                 ordered[counting_arr[1] - 1] = 1
                 ordered[4-1] = 1
                 ordered[3] = 1
                 更新:    ordered=[0,0,0,1,1,1,0]
                          counting_arr=[1,3,6,7]

         i=2时:  ordered[counting_arr[nums[2] - 0] - 1] = nums[2]
                 ordered[counting_arr[3] - 1] = 3
                 ordered[7-1] = 3
                 ordered[6] = 3
                 更新:    ordered=[0,0,0,1,1,1,3]
                          counting_arr=[1,3,6,6]

         i=1时:  ordered[counting_arr[nums[1] - 0] - 1] = nums[1]
                 ordered[counting_arr[0] - 1] = 0
                 ordered[1-1] = 0
                 ordered[0] = 0
                 更新:    ordered=[0,0,0,1,1,1,3]
                          counting_arr=[0,3,6,7]

         i=0时:  ordered[counting_arr[nums[0] - 0] - 1] = nums[0]
                 ordered[counting_arr[1] - 1] = 1
                 ordered[3-1] = 1
                 ordered[2] = 1
                 更新:    ordered=[0,0,1,1,1,1,3]
                          counting_arr=[1,2,6,7]
  """


def counting_sort(nums):
    if nums is None:
        return []
    nums_len = len(nums)
    nums_max = max(nums)
    nums_min = min(nums)

    counting_arr_length = nums_max + 1 - nums_min
    counting_arr = [0] * counting_arr_length
    for number in nums:
        #   统计列表中每个值出现的次数,
        counting_arr[number - nums_min] += 1
    #   使counting_arr[i]存放<=i的元素个数
    for i in range(1, counting_arr_length):
        counting_arr[i] = counting_arr[i] + counting_arr[i-1]
    #   存放排序结果
    ordered = [0] * nums_len
    for i in reversed(range(0, nums_len)):
        ordered[counting_arr[nums[i] - nums_min] - 1] = nums[i]
        counting_arr[nums[i] - nums_min] -= 1
    return ordered


if __name__ == '__main__':
    draw_input = input
    user_input = draw_input('输入待排序的数,用\",\"分隔:\n').strip()
    unsorted = [int(item) for item in user_input.split(',')]
    print(counting_sort(unsorted))

猜你喜欢

转载自blog.csdn.net/u011095460/article/details/87888248
今日推荐