python 实现经典算法
import time
start_time = time.clock() list_ = [9, 2, 7, 4, 5, 6, 3, 8, 1] """
# 堆排序(通过不断的构造最大堆来选出序列的最大值放到末尾)
# 最大堆调整:将堆的末端子节点调整,使得子节点永远小于父节点。
# 建立最大堆:将堆所有数据重新排序。
# 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算。
import random def max_heapify(heap, heapsize, root):
# 最大堆调整
left = 2 * root + 1
right = left + 1
larger = root
if left < heapsize and heap[larger] < heap[left]:
larger = left
if right < heapsize and heap[larger] < heap[right]:
larger = right
if larger != root:
heap[larger], heap[root] = heap[root], heap[larger]
max_heapify(heap, heapsize, larger) def build_max_heap(heap):
# 构造一个堆,将堆中所有数据重新排序
heapsize = len(heap)
for i in range((heapsize - 2) // 2, -1, -1):
max_heapify(heap, heapsize, i) def heapsort(heap):
# 将根节点去除与最后一位做对调,对前面len-1个节点继续进行对调整过程。
build_max_heap(heap)
for i in range(len(heap) - 1, -1, -1):
heap[0], heap[i] = heap[i], heap[0]
max_heapify(heap, i, 0)
return heap if __name__ == '__main__':
a = [30, 50, 57, 77, 62, 78, 94, 80, 84]
print(a)
heapsort(a)
print(a)
# b = [random.randint(1, 1000) for i in range(1000)]
# print(b)
# heapsort(b)
# print(b)
# -------------------------------------------------------------- # 归并排序
# 首先用分割的方法将这个序列分割成一个个已经排好序的子序列,然后
# 再利用归并的方法将一个个的子序列合并成排序号的序列
def merge(left, right):
result = []
while left and right:
result.append(left.pop(0)) if left[0] < right[0] else result.append(right.pop(0))
while left:
result.append(left.pop(0))
while right:
result.append(right.pop(0))
return result def mergesort(l):
if len(l) < 2:
return l
mid_index = len(l) // 2
left = mergesort(l[:mid_index])
right = mergesort(l[mid_index:])
return merge(left, right) print(mergesort(list_))
# -------------------------------------------------------------- # 希尔排序 将序列分割成若干子序列(由相隔某个增量的元素组成的)分别进行直接插入排序接着依次缩小增量继续进行排序,待整个序列基本有序时,再对全体元素进行插入排序。
def shell_sort(l):
n = len(l)
gap = n // 2
while gap > 0:
for i in range(gap, n):
temp = l[i] # 每个步长进行插入排序
j = i
# 插入排序
while j >= gap and l[j - gap] > temp:
l[j] = l[j - gap]
j -= gap
l[j] = temp
gap = gap // 2
return l print(shell_sort(list_))
# -------------------------------------------------------------- # 插入排序
# 从索引1开始,一次与其左边的数相比较,若比自己大则插入并删除自己。
def insertsort(l):
len_ = len(l)
for i in range(1, len_):
for j in range(i):
if l[j] > l[i]:
l.insert(j, l[i])
l.pop(i+1)
break
return l print(insertsort(list_))
# -------------------------------------------------------------- # 快速排序
# 选定一个基数如第一个元素
# 将比基数小的和比基数大的元素分别放在新列表里并按顺序排列相加
# 递归直到新列表元素只有一个
def quicksort(l):
len_ = len(l)
if len_ < 2:
return l
else:
pivot = l[0]
less = [i for i in l[1:] if i <= pivot]
greater = [j for j in l[1:] if j > pivot]
print(less, greater)
return quicksort(less) + [pivot] + quicksort(greater) print(quicksort(list_))
# -------------------------------------------------------------- # 选择排序
# 将第一个数与右边数的最小值相比较,若本身较大则与最小值调换位置
# 依次遍历即可
def selectsort(l):
len_ = len(l)
for i in range(len_ - 1):
for j in range(i+1, len_):
min_ = min(l[j:])
min_index = l.index(min_)
if l[i] > min_:
l[i], l[min_index] = l[min_index], l[i]
return l
# 上述选择排序代码存在问题,这次复习自己重写时发现对重复数字处理不对,同时循环也有问题。以下是更改后代码:
def selectsort(l):
length = len(l)
for i in range(length-1):
m = min(l[i+1:]) # 当前数字右边的数字列表中的最小数
j = l[i+1:].index(m) + i + 1 # m的索引,防止重复数字的干扰
if l[i] > m:
l[i], l[j] = l[j], l[i]
return l
print(selectsort(list_))
# -------------------------------------------------------------- # 冒泡排序
# 从索引0开始依次本身和右边的元素,若右边小则调换位置,来取得最大值
# 然后依次循环把较大的轮换到右边
def bubblesort(l):
len_ = len(l)
for i in range(len_ - 1):
for j in range(len_ - i - 1):
if l[j] > l[j+1]:
l[j], l[j+1] = l[j+1], l[j]
return l print(bubblesort(list_))
""" end_time = time.clock()
print(end_time - start_time)
目前对于堆排序还不太理解,以备后续重温复习。
python 实现经典算法的更多相关文章
- python每日经典算法题5(基础题)+1(中难题)
现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...
- python每日经典算法题5(基础题)+1(较难题)
一:基础算法题5道 1.阿姆斯特朗数 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数.判断用户输入的数字是否为阿姆斯特朗数. (1)题目分析:这里要先得到该数是多少位的,然后再把 ...
- python实现经典算法
1,快速排序 题目形式:手写一下快速排序算法. 题目难度:中等. 出现概率:约50%.手写快排绝对是手撕代码面试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题. 参考代码: def quic ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法
(一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- python数据结构与算法——归并排序
归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
随机推荐
- 单例解决存储微信Token信息保留两小时
采用单例模式可以存储初始化数据,比如第一次对/api/test接口进行了访问,传入的信息为“123”,则在两个小时之内返回的信息依然是“123”,无论传入的参数是什么,如果有效时间过了两个小时,比如传 ...
- BitLocker:如何启用网络解锁
TechNet 库Windows ServerWindows Server 2012 R2 和 Windows Server 2012服务器角色和技术安全和保护BitLockerBitLocker 中 ...
- Kinect关于PlayerIndex和SkeletonId之间的关系。
项目中要锁定玩家骨骼后抠图, 一时没有灵感.google 关键词: the ralationship about skeletonid and playerindex. 结论: Player Segm ...
- Java 注解(Annoation)学习笔记
1 Junit中的@Test为例: 1.1 用注解(@Test)前 private boolean isTestMethod(Method m) { return m.getParameterType ...
- 架构师速成6.7-设计开发思路-uml 分类: 架构师速成 2015-07-29 18:25 157人阅读 评论(0) 收藏
uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其 ...
- Windows下python 3 pip程序升级异常问题及pip常用命令
最近在学习,Selenium+Python自动化,在安装selenium包的时候,出现无法安装的情况,并提示Pip有新的版本,我的版本太低了.然后安装系统提示操作,pip升级也出现异常,报错timeo ...
- CMDB项目实战
01-CMDB项目介绍 02-CMDB开发背景 03-CMDB开发目的 04-CMDB资产采集方式之agent 05-CMDB资产采集方式之ssh 06-CMDB资产采集方式之saltstack 07 ...
- ConfigurationManager.ConnectionStrings 类库 取不到值 报错 初始化错误
是因为我把 config 文件写在了 类库中,(擦,很久之前就处理过好多次,总是忘记 写个文章记录下来) 其实应该放在 主目录底下的 web.comfig 里 就是网站项目的 配置文件里,类库找的 是 ...
- C++中include<> 与 include" " 的区别
<>时先去系统目录中找头文件,如果没有再到当前目录下找.所以像标准的头文件 stdio.h, stdlib.h等都用<>; ""则首先到当前目录下找,如果找 ...
- 朗格拉日计数(counter)
朗格拉日计数(counter) 题目描述 在平面上以圆周等分排列着n个带标号(标号为1-n)的点,你需要计算有多少个三元组(a,b,c),满足a<b<c而且标号为a,b,c的点在圆上分布的 ...