• 排序-计数-优化版


    计数排序优化版:
    引用:https://www.cnblogs.com/xiaochuan94/p/11198610.html
    基础版能够解决一般的情况,但是它有一个缺陷,那就是存在空间浪费的问题。
    比如一组数据{101,109,108,102,110,107,103},其中最大值为110,按照基础版的思路,
    我们需要创建一个长度为111的计数数组,但是我们可以发现,它前面的[0,100]的空间完全浪费了,
    那怎样优化呢?
    将数组长度定为max-min+1,即不仅要找出最大值,还要找出最小值,根据两者的差来确定计数数组的长度。

    python算法实现:
    import math
    
    def countSort(data):
        #假设负无穷大为最小值,正无穷大为最大值
        listMin = float("inf")
        listMax = float("-inf")
        #找出数组data中的最大值、最小值
        for i in data:
            listMax = max(i,listMax)
            listMin = min(i,listMin)
        #初始化计数数组count
        countList = [0] * (listMax - listMin + 1)
        #对计数数组各元素赋值,data列表中的值,即是countList的索引,
        # 索引位置对应的值表示该数字出现的次数,countList中的元素要减去最小值,再作为新索引
        for i in data:
            countList[i-listMin] += 1
        #创建结果数组
        resultList = [0] * len(data)
        #创建结果数组的起始索引
        index = 0
        for i in range(len(countList)):
            #只统计出现次数大于0的情况,当其值大于0,说明出现了该数字
            while countList[i] > 0 :
                #i的值表示原列表中需要比较的数,再将减去的最小值补上
                resultList[index] = i + listMin
                index += 1
                #出现次数减1
                countList[i] -= 1
        return resultList
    
    
    def main():
        data = list(map(int, input("请输入需要排序的列表,逗号间隔:").split(",")))
        #101,109,108,102,110,107,103
        rtn = countSort(data)
        print("计数排序结果为:", end="")
        print(rtn)
    
    if __name__ == "__main__":
        main()
     
  • 相关阅读:
    微服务配合docker使用
    基于docker部署使用ELK+FileBeat日志管理平台
    Ubuntu开发用新机安装流程
    http 直接从body里传输数据
    005
    003
    004
    001
    002
    谷歌查看、管理cookie
  • 原文地址:https://www.cnblogs.com/an-wl/p/12631457.html
Copyright © 2020-2023  润新知