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. 第一章 数据库和SQL

    1-1 数据库是什么?   一.数据库的含义 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合. 数据库DB   二.数据库管理系统 DBMS 用来管理数据库的计算机系统称为 ...

  2. C++虚函数原理

    类中的成员函数分为静态成员函数和非静态成员函数,而非静态成员函数又分为普通函数和虚函数. Q: 为什么使用虚函数 A: 使用虚函数,我们可以获得良好的可扩展性.在一个设计比较好的面向对象程序中,大多数 ...

  3. linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘

    linux或者OS X系统中,使用“dd”命令可以直接在终端命令行模式下,制作ISO镜像的系统安装盘. 一.linux系统以centOS7为例. sudo dd if=镜像路径 of=USB设备路径 ...

  4. 关于springMVC的一些xml配置

    ①springMVC必备jar包: commons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE. ...

  5. svn回退到具体的版本

    svn回退到具体的版本 找到项目的版本号 命令行中输入相关命令  到指定地点找到项目即可

  6. Celery学习---Celery 分布式队列介绍及安装

    Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...

  7. [转]CentOS7增加或修改SSH端口号

    前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeLinux和防火墙(FireWall)的安全策略下手.如果使用阿里云,腾讯等第三方服务器还需要对管理控制台的安全组 ...

  8. 【MySQL学习杂记】 2017年7月13日

    1. 关于分组 当select使用groupby语法时,select返回字段集合里面除去 <使用了聚合函数的字段>.<不包含在 group by 子句的字段> 的其他字段,这些 ...

  9. php实现动态随机验证码机制(CAPTCHA)

    php实现动态随机验证码机制 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Ap ...

  10. angularjs中URL中的#号问题,$locationProvider.html5Mode(true)刷新404

    解决办法原文地址:https://blog.csdn.net/weixin_36185028/article/details/72179568 angularjs支持两种url模式,hash模式和ht ...