1、计数排序

# -*- coding: utf-8 -*-
# @Time : 2018/07/31 0031 11:32
# @Author : Venicid def count_sort(li, max_num):
count = [0 for i in range(max_num + 1)]
for num in li:
count[num] += 1
i = 0
for num, m in enumerate(count):
for j in range(m):
li[i] = num
i += 1 import random
data = []
for i in range(100000):
data.append(random.randint(0,100)) count_sort(data, 100)
print(data)

计数排序这么快,为什么不用计数排序呢?因为他是有限制的,你要知道列表中的最大数

如果一下来了一个很大的数,比如10000,那么占的空间就的这么大,

计数排序占用的空间和列表的范围有关系

解决这种问题的方法,可以用桶排序,都放进去可以在进行其他的排序。比如插入排序。

2、TOP10榜单:topk

  (1)方式1:思路:插入排序  O(kn)

  

# -*- coding: utf-8 -*-
# @Time : 2018/07/31 0031 11:59
# @Author : Venicid def insert(li, i):
"""一次insert"""
tmp = li[i]
j = i - 1
while j >= 0 and li[j] > tmp:
li[j + 1] = li[j]
j = j - 1
li[j + 1] = tmp def insert_sort(li):
for i in range(1, len(li)): # 从第二个位置,即下标为1的元素开始向前插入
insert(li,i) def topk(li, k):
top = li[0:k + 1] # top10, 多开辟一个存放,新进来的数据
insert_sort(top)
for i in range(k + 1, len(li)):
top[k] = li[i]
insert(top, k)
return top[:-1] # 去掉最后一个 import random
data = list(range(20))
topk_ = random.shuffle(data)
print(data) print(topk(data, 10))

  (2)方式2:堆的应用:nlogk

          

def sift(data, low, high):
"""调整"""
i = low # 父亲的位置
j = 2 * i + 1 # 孩子的位置
tmp = data[i] # 原省长退休
while j <= high: # 孩子在堆里
if j + 1 <= high and data[j] < data[j + 1]: # if右孩子存在且右孩子更大
# if j + 1 <= high and data[j] > data[j + 1]: # if右孩子存在且右孩子更大
j += 1
if data[j] > tmp: # 孩子比最高领导大
# if data[j] < tmp: # 孩子比最高领导大
data[i] = data[j] # 孩子上移一层
i = j # 孩子成为新父亲
j = 2 * i + 1 # 新孩子
else:
break
data[i] = tmp # 省长放到对应的位置上(村民/叶子节点) def topn(li, n):
heap = li[0:n]
# 建堆
for i in range(n // 2 - 1, -1, -1):
sift(heap, i, n - 1) # 遍历
for i in range(n, len(li)):
if li[i] < heap[0]:
# if li[i] > heap[0]:
heap[0] = li[i]
sift(heap, 0, n - 1)
for i in range(n - 1, -1, -1): # i指向堆的最后
heap[0], heap[i] = heap[i], heap[0] # 领导退休,刁民上位
sift(heap, 0, i - 1) # 调整出新领导
return heap import random data = list(range(20))
topk_ = random.shuffle(data)
print(data) print(topn(data, 10))

3、heapq实现堆排序

python官方文档

https://docs.python.org/3/library/index.html

# -*- coding: utf-8 -*-
# @Time : 2018/07/31 0031 15:07
# @Author : Venicid import heapq
import random h = []
data = list(range(10000))
random.shuffle(data)
# heapq.heappush(h,1) # [1] # 生成小栈堆
for num in data:
heapq.heappush(h, num)
print(h) #[0, 1, 2, 4, 3, 5, 7, 8, 6, 17, # 出数
for i in range(len(h)):
print(heapq.heappop(h)) # top最大 top最小的
print(heapq.nsmallest(10, data))
print(heapq.nlargest(10, data))

3、计数排序,电影top100的更多相关文章

  1. requests+正则表达式提取猫眼电影top100

    #requests+正则表达式提取猫眼电影top100 import requests import re import json from requests.exceptions import Re ...

  2. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  3. python 爬取猫眼电影top100数据

    最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel. 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据 ...

  4. 计数排序(counting-sort)——算法导论(9)

    1. 比较排序算法的下界 (1) 比较排序     到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.   ...

  5. 计数排序和桶排序(Java实现)

    目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...

  6. CF 375B Maximum Submatrix 2[预处理 计数排序]

    B. Maximum Submatrix 2 time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  7. 计数排序-java

    今天看了一本书,书里有道题,题目很常见,排序,明了点说: 需求:输入:最多有n个正整数,每个数都小于n, n为107 ,没有重复的整数 输出:按升序排列 思路:假设有一组集合 {1,3,5,6,11, ...

  8. 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

    E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...

  9. 计数排序算法——时间复杂度O(n+k)

    计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于 ...

随机推荐

  1. Sqlserver2014 迁移数据库

    由于当初安装sqlserver 的时候选择默认安装的路径,导致现在c盘爆满,安装不了其它软件.因此想到了迁移数据库,网上搜索了一些简介,但是缺少一些步骤,导致数据库附加的时候失败.现总结如下: 1.将 ...

  2. 分别用C/C++ 和 C#实现简单的观察者模式

    网上找了很多关于观察者模式的代码例子和文章,都写的比较复杂,我个人还是喜欢从易到难,今天自己参考网上资料,也写了一个简单观察者模式的例子,简单的复习了一下Observer 模式,Observer 模式 ...

  3. 封装CIImage实现实时渲染

    封装CIImage实现实时渲染 CIImage属于CoreImage里面的东东,用来渲染图片的,为什么要封装它呢?其实很简单,封装好之后使用更加方便. 如果直接使用CIImage渲染图片,使用的流程如 ...

  4. Linux 隐藏系统信息

    Linux查看系统信息 [更多参考]https://www.cnblogs.com/ftl1012/p/uname.html Linux隐藏系统信息 查看: cat /etc/issue.net    ...

  5. Xman资格选拔赛-web

    variacover 这道题一打开就是源码,主要就是根据源码构造url.其中,它接收的参数只有b,但源码中要获取flag的关键参数是a[0].parse_str()函数的作用是把查询字符串解析到变量中 ...

  6. CSS 鼠标样式

    设置鼠标指针放在一个元素边界范围内时所用的光标形状,需要对元素的css属性cursor进行设置. cursor属性可能的值: default 默认光标(通常是一个箭头) auto 默认.浏览器设置的( ...

  7. 以太坊系列之一: 以太坊RLP用法-以太坊源码学习

    RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...

  8. 【原创】uwsgi中多进程+多线程原因以及串行化accept() - thunder_lock说明

    如有不对,请详细指正. 最近再研究uwsgi如何部署python app,看uwsgi的文档,里面有太多的参数,但每个参数的解释太苍白,作为菜鸟的我实在是不懂.想搞清楚uwsgi的工作原因以及里面的一 ...

  9. 谷歌希望让 Swift 成为安卓的优先选择,以取代由 Oracle 开发的 Java 程序语言。

    http://news.coolban.com/Web/Index/land/app/2/id/405239

  10. 1552/3506. [CQOI2014]排序机械臂【平衡树-splay】

    Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...