Python之路Day17
算法:冒泡排序、插入排序、快速排序、堆排序
冒泡排序
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com
"""
冒泡排序
"""
import random
import time
def get_list(arg):
"""
获得一个有指定个数的1000以内数字的列表
:param arg: 期望获得的列表内数字的个数
:return:
"""
list_tmp = []
for i in range(arg):
list_tmp.append(random.randrange(100000))
return list_tmp
def bubble_sort(arg):
n = 0
for i in range(len(arg)-1):
n += 1
for j in range(i+1, len(arg)):
n += 1
if arg[i] < arg[j]:
arg[i], arg[j] = arg[j], arg[i]
print("此次循环:{} 次。".format(n))
return arg
if __name__ == "__main__":
l1 = get_list(50000)
start_time = time.time()
l2 = bubble_sort(l1)
end_time = time.time()
print("此次耗时:{} 秒。".format(end_time-start_time))
bobble sort
选择排序
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com
"""
选择排序
"""
import random
import time
def get_list(arg):
"""
获得一个有指定个数的1000以内数字的列表
:param arg: 期望获得的列表内数字的个数
:return:
"""
list_tmp = []
for i in range(arg):
list_tmp.append(random.randrange(100000))
return list_tmp
def selection_sort(arg):
n = 0
for i in range(len(arg)-1):
n += 1
index = i
for j in range(i+1, len(arg)):
n += 1
# 从i之后的元素中找最小的,然后和arg[i]交换
if arg[index] > arg[j]:
index = j
arg[i], arg[index] = arg[index], arg[i]
print("此次循环:{} 次。".format(n))
return arg
if __name__ == "__main__":
l1 = get_list(50000)
start_time = time.time()
l2 = selection_sort(l1)
end_time = time.time()
print("此次耗时:{} 秒。".format(end_time-start_time))
selection sort
插入排序
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com
"""
插入排序
"""
import random
import time
def get_list(arg):
"""
获得一个有指定个数的1000以内数字的列表
:param arg: 期望获得的列表内数字的个数
:return:
"""
list_tmp = []
for i in range(arg):
list_tmp.append(random.randrange(100000))
return list_tmp
def insertion_sort(arg):
n = 0
for i in range(1, len(arg)):
n += 1
# 记下当前的索引
index = i
# 记下当前值
current_value = arg[i]
# 如果索引大于0,并且它前面已经排序了的列表的最后一个值比当前值大
while index > 0 and arg[index-1] > current_value:
# 就把它之前已经排序了的列表的值往后移一位
arg[index] = arg[index-1]
# 接着在已经排序的列表往前取值比较
index -= 1
n += 1
# 如果索引=0或者当前的已经排序了的列表中索引为index-1的值比当前值小
# 那么就把current_value放到index位置
arg[index] = current_value
print("此次循环:{} 次。".format(n))
return arg
if __name__ == "__main__":
l1 = get_list(50000)
start_time = time.time()
l2 = insertion_sort(l1)
end_time = time.time()
print("此次耗时:{} 秒。".format(end_time-start_time))
insertion sort
快速排序
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com
"""
快速排序
"""
import random
import time
def get_list(arg):
"""
获得一个有指定个数的1000以内数字的列表
:param arg: 期望获得的列表内数字的个数
:return:
"""
list_tmp = []
for i in range(arg):
list_tmp.append(random.randrange(1000000))
return list_tmp
def quick_sort(original_list, start, end):
"""
:param original_list: 待排序的列表
:param start: 第一个元素的索引
:param end: 最后一个元素的索引
:return:
"""
# 参数输错直接退出
if start >= end:
return
# 取一个key值
value_key = original_list[start]
left = start
right = end
while left < right:
# 先从右往左比较
while left < right and original_list[right] > value_key:
right -= 1
# 把最前面的值跟这个比key小的值互换
# 把最左边的值换成从右往左找到的那个比key小的那个值
original_list[left], original_list[right] = original_list[right], original_list[left]
#
while left < right and original_list[left] <= value_key:
left += 1
# 如果从左往右找到了比key大的数
original_list[left], original_list[right] = original_list[right], original_list[left]
quick_sort(original_list, start, left-1)
quick_sort(original_list, right+1, end)
if __name__ == "__main__":
l1 = get_list(500000)
start_time = time.time()
quick_sort(l1, 0, len(l1)-1)
end_time = time.time()
print("此次耗时:{} 秒。".format(end_time-start_time))
quick sort
堆排序
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Q1mi"
# Email: master@liwenzhou.com
"""
堆排序
"""
import random
import time
def get_list(arg):
"""
获得一个有指定个数的1000以内数字的列表
:param arg: 期望获得的列表内数字的个数
:return:
"""
list_tmp = []
for i in range(arg):
list_tmp.append(random.randrange(1000000))
return list_tmp
def sift_down(lst, start, end):
"""
:param lst: 待排序的数组
:param start: 开始排序的节点
:param end: 末节点
:return: 调整为最大堆结构
"""
root = start
while True:
child = 2 * root + 1 # 默认设置左子节点为最大子节点
# 子节点越界就跳出
if child > end:
break
# 如果右子节点没越界,并且右子节点的值比左子节点大
if child + 1 <= end and lst[child] < lst[child+1]:
# 设置右子节点为最大子节点
child += 1
# 如果根节点的数小于值大的那个子节点
if lst[root] < lst[child]:
# 互换位置
lst[root], lst[child] = lst[child], lst[root]
# 设置正在调整的节点为root
root = child
# 无需调整就退出
else:
break
def heap_sort(lst):
for i in range(len(lst)//2, -1, -1):
sift_down(lst, i, len(lst)-1)
for j in range(len(lst)-1, 0, -1):
lst[0], lst[j] = lst[j], lst[0]
sift_down(lst, 0, j-1)
return lst
if __name__ == "__main__":
list_demo = get_list(500000)
start_time = time.time()
heap_sort(list_demo)
end_time = time.time()
print("此次耗时:{} 秒。".format(end_time-start_time))
heap sort
Python之路Day17的更多相关文章
- Python之路,Day17 - 分分钟做个BBS论坛
Python之路,Day17 - 分分钟做个BBS论坛 本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...
- Python之路【第一篇】python基础
一.python开发 1.开发: 1)高级语言:python .Java .PHP. C# Go ruby c++ ===>字节码 2)低级语言:c .汇编 2.语言之间的对比: 1)py ...
- Python之路
Python学习之路 第一天 Python之路,Day1 - Python基础1介绍.基本语法.流程控制 第一天作业第二天 Python之路,Day2 - Pytho ...
- python之路 目录
目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...
- Python之路【第十九篇】:爬虫
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- Python之路【第十五篇】:Web框架
Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...
随机推荐
- Vim 实用技术,第 1 部分: 实用技巧(转)
原文链接:http://blog.jobbole.com/20604/ 0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱 ...
- rsyslog 日志归类思路--根据syslog local5 nginx-zjzc01;
Aug 5 16:36:12 jrhwpt01 nginx-zjzc01: www.zjcap.cn 10.252.105.157 10.171.246.184 [05/Aug/2016:16:36: ...
- 腾讯出品的抓包工具Rythem
Mac下一直没有fiddler这样好用的抓包工具,Charles要收费,难免不爽,昨天调研国内项目的时候,看到腾讯开源了一款抓包工具Rythem,试用了一下,基本配置无问题,但是通配符方面不太搞的定. ...
- nhibernate 更新 SqlDateTime 溢出问题
最近在用nhibernate,更新实体 时遇到一个SqlDateTime 溢出问题 费力调了N久,开始以为是实体的日期格式属性未赋值,但是调试发现哪怕实体对应的日期类型属性赋值了,也会报同样的错误. ...
- 关于js封装框架类库之事件模块
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获 ...
- 解决 Tomcat reload WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but fail
转自:http://www.cnblogs.com/interdrp/p/5632529.html 我的错误如下: 06-Sep-2016 18:57:10.595 WARNING [localhos ...
- hdu 4638 Group 莫队算法
题目链接 很裸的莫队, 就不多说了... #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) # ...
- codeforces 400E. Inna and Binary Logic 线段树
题目链接 给出n个数, 定义a[1][i]为这初始的n个数, 然后a[i][j] = a[i-1][j]&a[i-1][j-1], 这样就可以得到一个三角形一共n*(n-1)/2个数. 给出一 ...
- angularjs学习总结(快速预览版)
对html标签的增强 -> 指令 指令的本质是什么 声明的方式调用相应的脚本,实现一些操作,声明的所在的dom就是脚本的执行上下文? 自定义标签 -- 标签指令自定义属性 -- 属性指令特定格式 ...
- JBoss Jopr
http://rhq.jboss.org/ https://issues.jboss.org/browse/JBPAPP6-947 挺好的网站: http://outofmemory.cn/code- ...