话说,一口气不能吃个胖子,

一次性 学习 计数排序, 也确实容易消化不良.

下面,我们逐步学习下计数排序.

1.  已知一个简单列表 l1 = [5, 4, 3],

分析下这个列表的情况

5 > 4,  5 > 3,  所以 5 比列表中其他数大 的次数,  是  2

4 > 3,  4 < 5,   所以 4 比列表中其他数大 的次数,  是  1

3 < 4,  3 < 5,  所以 4 比列表中其他数大 的次数,  是   0

注意到了吗?

比 其他数大的次数, 序列 是    2 ->  5

1 ->  4

0 ->  3

如此,计数排序的核心原理就呼之欲出了.

统计每个数比列表其他数  大于 的次数,

次数越多  说明, 这个数越大,   反之, 大于的次数越少, 说明, 这个数就越小

下面,上代码:

 def sort(l):
n = len(l)
res = [None] * n # 结果列表
# 首次循环遍历, 每个列表的数都统计
for i in range(n):
# p 表示 a[i] 大于列表其他数 的次数
p = 0
# 二次循环遍历, 列表中的每个数都和首次循环的数比较
for j in range(n):
if l[i] > l[j]:
p += 1
res[p] = l[i]
return res print(sort([5, 4, 3])) 打印结果是: [3, 4, 5]

外层循环, 遍历列表每个数,

内层循环,  外层循环拿到的数 和 内层循环遍历的数, 逐个比较,  如果 外层循环 大于,  则 计数值 p + 1

内层循环结束,  则把外层循环的数, 放在 结果列表 的 索引 为 p 的位置上

2. 上面代码, 对于 列表中 , 如果数值, 都不相等, 则是ok的.

如果列表 是  [5, 5, 3]  , 打印结果 是 [3, 5, None].

为什么结果就不正确了呢?

因为 有两个 5,  计算的结果都是  p = 1

所以, 两个 5 , 都被放在结果列表  索引 1 的位置上了,

索引 2 的位置,没有放数.

优化后的代码逻辑如下:

 def sort(l):
n = len(l)
res = [None] * n
# 首次循环遍历, 每个列表的数都统计
for i in range(n):
# p 表示 a[i] 大于列表其他数 的次数
p = 0
# q 表示 等于 a[i] 的次数
q = 0
# 二次循环遍历, 列表中的每个数都和首次循环的数比较
for j in range(n):
if l[i] > l[j]:
p += 1
elif l[i] == l[j]:
q += 1
for k in range(p, p+q): # q表示 相等的次数,就表示, 从 P 开始索引后, 连续 q 次,都是同样的 数
          
res[k] = l[i]
return res print(sort([5, 5, 3])) 打印结果是: [3, 5, 5]

上述改进代码,容易困惑的地方: 是 16 - 17 行代码,

print(k, p, q, p+q)

建议读者, 在 16 和 17 之间, 加入 如上代码, 打印看看 

16, 17行代码, 逻辑上也不完美, 
比如, 两个 5, 就会被 重复赋值

计数排序之python的更多相关文章

  1. 计数排序之python 实现源码

    old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)): new[old[i]] = new[ ...

  2. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  3. python实现线性排序算法-计数排序

    计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到 ...

  4. 【程序员笔试面试必会——排序②】Python实现 计数排序、基数排序

    一.计数排序 概要: 时间复杂度O(n),空间复杂度O(k),k是输入序列的值的范围(最大值-最小值),是稳定的.计数排序一般用于已知输入值的范围相对较小,比如给公司员工的身高体重信息排序. 思路: ...

  5. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  6. python实现计数排序

    计数排序有局限性,最小值和最大值决定着数组的长度,如果分配均匀的话可以用 # @File: count_sort import random def count_sort(li, max_num=10 ...

  7. 计数排序、桶排序python实现

    计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个 ...

  8. 20191104-基于Python计数排序算法分析

    计数排序 计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置,也就是说元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的,将每个元素出现的次数记 ...

  9. 8大排序之Python实现 冒泡排序优化

    1.冒泡排序(从大到小):交换发生在内部循环 稳定的排序 冒泡排序的平均时间复杂度是O(n2),最好的时间复杂度是O(n),最坏的时间复杂度是O(n2),空间复杂度为O(1) 冒泡排序的优化在于did ...

随机推荐

  1. django中ajax的使用以及避开CSRF 验证的方式

    ajax(Asynchronous Javascript And Xml) 异步javascript和XML ajax的优点 使用javascript技术向服务器发送异步请求 ajax无须刷新整个页面 ...

  2. leetcode每日刷题计划-简单篇day12

    Num 125 验证回文串 Valid Palindrome 非常有收货的一道题嘻嘻嘻,本来是考试期间划水挑的题,坑点有点多 第一个是注意对temp1和temp2中途更新的判断 第二个是字符串频繁的作 ...

  3. MySQL(基础技能)

    一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Serve ...

  4. Could not read document: Can not deserialize instance of java.lang.String out of START_ARRAY

    线上问题: { "timestamp": "1544510665", "status": 400, "error": & ...

  5. 【jira】java.lang.OutOfMemoryError: GC overhead limit exceeded

    登录JIRA访问打开缓慢,查询日志出现下述提示:java.lang.OutOfMemoryError: GC overhead limit exceeded 修改setenv.sh文件中的JVM配置, ...

  6. TIMESTAMP(6)类型的时间差

    TIMESTAMP 数据类型 它包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息. 以分钟为单位查询时间差 select ROUND(TO_NUMBER(to_date(to_c ...

  7. 地址栏输入url按回车发生了什么

    浏览器向DNS服务器(先查找缓存)查找输入URL对应的IP地址 DNS服务器返回对应的IP地址 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码 浏览器 ...

  8. linux脚本启动应用

    手动输入一些命令,启动任务会很麻烦.可以写个start.sh脚本,去执行. #!bin/sh pid=`ps -ef|grep -v grep|grep ****-1.0-SNAPSHOT.jar|a ...

  9. redis数据转移随笔

    生产环境有一批版本比较老的redis主从架构,是一主多从,版本是2.8 由于想迁移到阿里云上,那么问题来了,怎么把redis数据转移到阿里云上 为了省事,阿里云也是和生产环境一样的版本,架构也一致,其 ...

  10. WCF输出JSON

    public class MyService : IService { public Message GetXml(string format) { WebOperationContext conte ...