python第三十二天-----算法
算法(Algorithm):一个计算过程,解决问题的方法
时间复杂度:用来评估算法运行效率的一个东西
ps:在日常使用中,请使用sort(),because no zuo no die!
1.冒泡排序:
指针如同气泡一样一个个由下向上浮,每次上浮如果上面的数比自己小则交换位置,这样就保证每次可以使最大的数字排列在最上面,重复此过程直到所有数有序;时间复杂度为O(n2),wtf,平方怎么打,就酱吧。
def bubble_sort_x(data):
for i in range(len(data)-1): # 在循环到最后一个数的时候就不需要再比较了,因为此时列表已经排列好了
for j in range(len(data)-i-1): # 指针一点点上浮的过程
if data[j] > data[j+1]
data[j+1], data[j] = data[j], data[j+1]
"调优后",但是你会发现并不是真正的调优,时快时慢,因为此调优仅对当某次交换完成后发现下面的数并未进行交换(也就是已经排序好了),那么就可以认为已经完成可以返回了,但是因为是这种特殊情况并不是每次都会出现,但是每次循环你必须要做一次判断,so,这个时间开销却是必须的,因此权衡利弊这下,北神还是觉得上面的好,简单易懂,萌萌哒。
def bubble_sort(data):
for i in range(len(data)-1):
exchange = False
for j in range(len(data) - i - 1):
if data[j] > data[j+1]:
data[j], data[j+1] = data[j+1], data[j]
exchange = True
if not exchange:
return
2.选择排序:
默认以无序区第一个数为列表内的最小数,然后遍历列表开始跟默认比较大小,如果发现了比默认值小的则成为新的默认最小数,遍历完成后会发现列表中的最小数再与第一个数互换位置,重复此过程就可以保证列表从第一个数开始由小到大排序;时间复杂度为O(n2),运行时间比冒泡快,因为它与冒泡一样都对数就行了比较,但是并没有直接互换位置,直到一次循环完成后找到了最小数才进行了一次位置互换,so,冒泡排序被吊打了。
def insert_sort_x(data):
for i in range(len(data)-1):
min_loc = i
for j in range(i+1, len(data)): # 从下一个开始跟i比较
if data[j] < data[min_loc]:
min_loc = j
data[i], data[min_loc] = data[min_loc], data[i]
3.希尔排序:
选择排序的升级版本,讲列表进行多次分段后各自进行排序,最后形成一个偏向有序的大列表,然后对整个大列表进行一次选择排序形成最终有序列表,看不懂就对了,没什么卵用。
def shell_sort_x(data):
gap = int(len(data) // 2)
while gap >= 1:
for i in range(gap, len(data)):
tmp = data[i]
j = i - gap
while j >= 0 and tmp < data[j]:
data[j + gap] = data[j]
j -= gap
data[i - gap] = tmp
gap = gap // 2
4.快速排序:
取第一个元素x使其归位,列表分成两部分,左边都比x小,右边都比x大,然后对这两边递归进行排序。
def quick_sort_x(data, left, right):
mid = partition(data, left, right) # x归位
quick_sort_x(data, left, mid-1)
quick_sort_x(data, mid+1, right) def partition(data, left, right):
tmp = data[left]
while left < right:
while left < right and data[range] >= tmp:
right -= 1
data[left] = data[right]
while left < right and data[left] <= tmp:
left += 1
data[right] = data[left]
data[left] = tmp
5.归并排序:
将数组递归切分成单个元素后对比排序合并。
def merge_sort_x(data, low, high):
if low < high:
mid = (low + high) // 2
merge_sort_x(data, low, mid)
merge_sort_x(data, mid+1, high)
merge(data, low, mid, high) def merge(data, low, mid, high):
i = low
j = mid + 1
ltmp = []
while i <= mid and j <= high:
if data[i] < data[j]: # 两边数依次取出比较大小
ltmp.append(data[i])
i += 1
else:
ltmp.append(data[j])
j += 1
while i <= mid: # 下面2个while只有一个会执行
ltmp.append(data[i])
i += 1
while j <= high:
ltmp.append(data[j])
j += 1
data[low:high+1] = ltmp
6.插入排序:
默认第一个元素是有序的,然后根据依次比较下一个元素与有序区内元素确定其位置。
def insert_sort_x(data):
for i in range(1, len(data)):
tmp = data[i]
j = i - 1
while j >= 0 and tmp < data[j]:
data[j + 1] = data[j]
j -= 1
data[j + 1] = tmp
7.堆排序:
建立一个堆,后去掉堆顶元素为最大元素放置于堆末尾(之后不参与计算),通过一次调整再次得到堆顶,循环重复此过程。
def sift(data, low, high):
i = low
j = 2 * i + 1
tmp = data[i]
while j <= high:
if j < high and data[j] < data[j + 1]:
j += 1
if tmp < data[j]:
data[i] = data[j]
i = j
j = 2 * i + 1
else:
break
data[i] = tmp def heap_sort_x(data):
n = len(data)
for i in range(n // 2 - 1, -1, -1):
sift(data, i, n - 1)
for i in range(n - 1, -1, -1):
data[0], data[i] = data[i], data[0]
sift(data, 0, i - 1)
python第三十二天-----算法的更多相关文章
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python实现ID3算法
自己用Python写的数据挖掘中的ID3算法,现在觉得Python是实现算法的最好工具: 先贴出ID3算法的介绍地址http://wenku.baidu.com/view/cddddaed0975f4 ...
- 以图搜图(一):Python实现dHash算法(转)
近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
随机推荐
- 一键安装 lnmp/lamp/lanmp
1.使用putty或类似的SSH工具登陆VPS或服务器 # screen -S lnmp 如果提示screen: command not found 命令不存在可以执行:yum install scr ...
- 【P1582】倒水(数论??暴力!!)
这个题我很无语,一开始看绿题,还是数论,应该不会特别简单,应该要动笔写上好一会,过了一会旁边 #祝神 说这原来是个蓝题,我顿时觉得十分迷茫... 结果看了这个题看了一会,仔细一想,woc,这题怕不是可 ...
- .gitignore 无效
利用.gitignore过滤文件,如编译过程中的中间文件,等等,这些文件不需要被追踪管理. 现象: 在.gitignore添加file1文件,以过滤该文件,但是通过Git status查看仍显示fil ...
- ZigzagConvert
public class ZigzagConvert { public static String convert(String s, int nRows) { int len = s.length( ...
- liunx常用命令-----查找命令
locate 根据文件名查找文件 根据数据库记录搜索,当天创建的搜不到 whereis which 搜索命令的命令 如 whereis ls find /root -name ...
- SQL Server 2016 —— 聚集列存储索引的功能增强
作者 Jonathan Allen,译者 邵思华 发布于 2015年6月14日 聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...
- java: InputStreamReader将字节的输入流变成字符的输入流,OutputStreamWriter将字符的输出流变成字节的输出流
InputStreamReader:将字节的输入流变成字符的输入流, OutputStreamWriter:将字符的输出流变成字节的输出流 //将缓冲区的内容读取,可以一次读取 //可以接收键盘的输入 ...
- FunnelWeb 开源Blog引擎介绍
FunnelWeb is an open source blog engine, built by developers for developers. Instead of fancy quotes ...
- poj2112 最大流+floyd+二分
题意:给一堆点,一部分是牛,一部分是机器,每头牛必须要走到一个机器,每个点之间有距离,要求每头牛都能找得到一台机器(机器有最大容量)的情况下,走的最远的牛距离最小 题解:二分答案,小于该距离的边才能加 ...
- TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议【转】
转自:http://blog.csdn.net/goodboy1881/article/details/668556 把这三个协议放到一起学习是因为这三个协议处于同一层(网际层),ARP协议用来找到目 ...