计数排序之python
话说,一口气不能吃个胖子,
一次性 学习 计数排序, 也确实容易消化不良.
下面,我们逐步学习下计数排序.
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的更多相关文章
- 计数排序之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[ ...
- 计数排序与桶排序python实现
计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...
- python实现线性排序算法-计数排序
计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到 ...
- 【程序员笔试面试必会——排序②】Python实现 计数排序、基数排序
一.计数排序 概要: 时间复杂度O(n),空间复杂度O(k),k是输入序列的值的范围(最大值-最小值),是稳定的.计数排序一般用于已知输入值的范围相对较小,比如给公司员工的身高体重信息排序. 思路: ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- python实现计数排序
计数排序有局限性,最小值和最大值决定着数组的长度,如果分配均匀的话可以用 # @File: count_sort import random def count_sort(li, max_num=10 ...
- 计数排序、桶排序python实现
计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个 ...
- 20191104-基于Python计数排序算法分析
计数排序 计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置,也就是说元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的,将每个元素出现的次数记 ...
- 8大排序之Python实现 冒泡排序优化
1.冒泡排序(从大到小):交换发生在内部循环 稳定的排序 冒泡排序的平均时间复杂度是O(n2),最好的时间复杂度是O(n),最坏的时间复杂度是O(n2),空间复杂度为O(1) 冒泡排序的优化在于did ...
随机推荐
- Javascript面向对象编程(一)
什么是面向对象? 它是一种新的编程模式.以往的面向过程是将功能都写在一起,逐行实现.面向对象与其不同,它只关心对象提供的功能,而不在乎细节. 面向对象的特点? 抽象:抓住问题的核心,贯穿始终: 封装: ...
- 【Appium自学】Android studio安装与配置(转)
转自链接:https://www.cnblogs.com/xiadewang/p/7820377.html 1.首先下载Android studio安装包. 可以从http://www.android ...
- Maintaining ICM Parameters for Using SSL for As JAVA
1770585 - How to configure SSL on the AS Java You can use this procedure to configure the necessary ...
- Python多线程thread、threading(一)
Python多线程(一) Python多线程,类似于同时执行多个不同程序,多线程运行的有点: 1.使用线程可以把占据长时间的程序中的任务放到后台去处理 2.用户界面可以更加吸引人,这样比如用户点击了一 ...
- Vue stage3
<body> <div id="box1"> <div v-bind:class="{ 'active': isActive, 'error ...
- 深入理解Java虚拟机读书笔记2----垃圾收集器与内存分配策略
二 垃圾收集器与内存分配策略 1 JVM中哪些内存需要回收? JVM垃圾回收主要关注的是Java堆和方法区这两个区域:而程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生,随线程而灭,随着方 ...
- Django07-cookie和session
一.Cookie 1.Cookie的由来 大家都知道HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响 ...
- 常用的web服务器软件整理(win+linux)
(1)Apache Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器 ...
- Vue note
1.npm run build 时,font:xx/xx "xxxx" 这种样式打包后会无效,只能写成font-size:xxx; line-height:xxx; font-fa ...
- js数值大小判断的错误
1.js中定义一个变量i,判断i的取值在[1,3]中的错误写法 if(1<= i <= 3) 假设js的值为4,浏览器在解析js时会先将1与4比较 ,显然1<= 4,返回结果为1,然 ...