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 ...
随机推荐
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- 【解决方法】You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
出现场景: 正常调试是没有问题的,但是在Archive的时候,报出了这个错误. 问题详情: (null): URGENT: all bitcode will be dropped because ‘x ...
- Fastboot的使用简单教程
大家都知道HTC手机重新启动进入所谓的project模式,就是HBOOT,然后能够进入FASTBOOT界面,在这个界面.我们能够在电脑端能够做非常多事,特别是HBOOT被改动过,假设是ENG S-OF ...
- 数字信号处理Day1自制电子音乐
第一天的课程感觉比較简单,主要介绍Karplus-Strong Algorithm 给出方程 y[n]=αy[n−M]+x[n], x[n]是输入,M是延迟,α是衰弱系数 我们要衰减D次,总的採样数就 ...
- java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制
package com.rgy.Test; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; ...
- superMap Object 属性查看的一点代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- spring IOC简单入门
spring的核心是ioc和aop 先介绍一下IOC(inverse of control控制反转)又叫DI(Dependency injection依赖注入) 个人理解为把对象的控制权由类转移到配置 ...
- C#编写的windows服务安装后启动提示“服务启动后又停止了”
使用C#编写的windows服务安装到服务器上行后进行启动时,总是提示“服务启动后又停止了”. 检查了服务逻辑是没问题,安装在开发本地也是正常,网上查了资料说是可能是服务没有注册,我检查了服务是正常注 ...
- 获取多个div,点击第几个,显示第几个
1.闭包:函数内部又定义了一个函数,内部函数引用外部函数的变量,就构成了闭包. <script type="text/javascript"> var divs = d ...
- jbpmAPI-6
第六章流程. 6.1. What is BPMN 2.0 业务流程模型和符号(BPMN)2.0规范是OMG规范,不仅定义了一个标准的业务流程的图形化表述(如BPMN 1. x),但现在还包括执行语义定 ...