Python常用算法(二)
1.快速排序
过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小
一般选取第一个数作为关键数据k,我们要把比k小的所有数据移到它的左面,从后往前找第一个比它小的数据,交换位置
比k大的数据移到它的右面,从前往后找第一个比它大的数据,交换位置,完成一个循环。
def quick1_sort(list):
if len(list) < 2:
return list
else:
key = list[0]
small = [i for i in list[1:] if i < key]
big = [j for j in list[1:] if j > key]
list = quick1_sort(small) + [key] + quick1_sort(big)
return list a1 = quick1_sort([2,1,4,3,6,5,7,8,10])
print(a1)
def quick_sort(list, left, right):
if left >= right:
return list
key = list[left]
low = left
high = right
while left < right:
while left < right and list[right] >= key:
right -= 1
list[left] = list[right]
while left < right and list[left] <= key:
left += 1
list[right] = list[left]
list[right] = key
quick_sort(list, low, left - 1)
quick_sort(list, left + 1, high)
return list s=[2,1,4,5,3,6,7,9,8]
a = quick_sort(s,0,len(s)-1)
print(a)
2.希尔排序
希尔排序是插入排序的增强版
1.首先知道整个列表的长度N,设置步数为step=N/2(取整数),
从第一个元素开始,每相隔为step的两个元素组成一组,按照直接插入的方法对每个小组进行排序,完成第一次排序
2.第二次排序将步数缩减一半,即step1=step/2,在按照步骤一的方法进行排序
3.重复步骤2,直到变成有序
def shell_sort(list):
gap = len(list)//2
while gap > 0:
for i in range(0, gap):
j = i+gap
while j < len(list):
k = j - gap
key = list[j]
while k >= 0:
if list[k] > key:
list[k+gap] = list[k]
list[k] = key
k -= gap
j += gap
gap = gap//2
return list a = shell_sort([2,1,4,3,9,7,8,6])
print(a)
def shell1_sort(list):
gap = len(list)//2
while gap > 0:
for i in range(gap, len(list)):
key = list[i]
j = i
while j >= gap:
if list[j-gap] > key:
list[j] = list[j-gap]
list[j-gap] = key
j = j - gap
gap = gap//2
return list a1 = shell1_sort([2,1,4,3,9,7,8,6])
print(a1)
3.归并排序
使用分割的方法将这个序列分割成一个个已经排好序的子序列,再利用归并的方法将其合成一个排序好的序列
#拆解的函数
def merge_sort(list):
if len(list) < 2:
return list
mid_length = len(list)//2
left = merge_sort(list[:mid_length])
right = merge_sort(list[mid_length:])
return merge(left,right)#合并 #return merge1(left, right) #合并函数
def merge(left, right):
result = []
while left and right:
result.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
while left:
result.append(left.pop(0))
while right:
result.append(right.pop(0))
return result def merge1(left, right):
result = []
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result a = merge_sort([4,7,1,2,8,9,3,6])
print(a)
Python常用算法(二)的更多相关文章
- Python常用算法
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- 第四百一十四节,python常用算法学习
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...
- Python 常用算法记录
一.递归 汉诺塔算法:把A柱的盘子,移动到C柱上,最少需要移动几次,大盘子只能在小盘子下面 1.当盘子的个数为n时,移动的次数应等于2^n – 1 2.描述盘子从A到C: (1)如果A只有一个圆盘,可 ...
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
- python常用算法学习(4)——数据结构
数据结构简介 1,数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.简单来说,数据结构就是设计数据以何种方式组织并存贮在计算机中.比如:列表,集合与字 ...
- python 常用算法学习(2)
一,算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求 ...
- Python常用模块二
一.time & datetime #_*_coding:utf-8_*_ import time # print(time.clock()) #返回处理器时间,3.3开始已废弃 , 改成了t ...
- Python常用模块(二)
一.json与pickle json与pickle模块是为了完成数据的序列化. 序列化是指把对象(变量)从内存中变成可存储或传输的过程,在Python中叫picking,在其他语言中也由其他的叫法,但 ...
- python常用算法(7)——动态规划,回溯法
引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...
随机推荐
- python笔记--1
pip工具常用命令: pip命令示例 说明 pip download SomePackage[==version] 下载扩展库的指定版本,不安装 pip freeze [> requiremen ...
- CRM客户关系管理系统(十一)
第十一章.学员报名流程开发 11.1.面包屑的制作 Boorstrap路径导航条 (1)table_obj_list.html页面面包屑 def table_obj_list 返回数据改成locals ...
- java程序的内存分配(一)
首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...
- Hibernate中配置文件的学习
首先我们看一下hibernate的主配置文件 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Conf ...
- FFPLAY的原理(五)
创建线程 Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio f ...
- Web开发问题记录
1.先说一个CSS的:CSS中带有中文(比如字体定义)的属性定义最好放在该选择器定义诸项的最后一条,为什么----编码格式问题. 2.其实自己也可以用自己写的DispatcherServlet+jsp ...
- 在基于debian的deepin或者Ubuntu上双等号“==”和双中括号“[[]]”不能使用的真相
使用的deepin-linux,今天写shell脚本的时候,忽然发现 sh test.sh 会报错[[: not found ,双等号和双中括号都不能使用了,很郁闷,后来探索发现,sh其实是dash的 ...
- java数据库(MySQL)之增删改查
1.查询数据 先救从简单的来吧,之前我们实现了将数据库表格信息读取到一个List集合中,数据库的查询,实 际上就是对这个集合的查询: public class Show { public static ...
- SOFA 源码分析— 自定义路由寻址
前言 SOFA-RPC 中对服务地址的选择也抽象为了一条处理链,由每一个 Router 进行处理.同 Filter 一样, SOFA-RPC 对 Router 提供了同样的扩展能力. 那么就看看 SO ...
- JavaScript函数节流和函数防抖之间的区别
一.概念解释 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段. 大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...