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)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
随机推荐
- struts2官方 中文教程 系列三:使用struts2 标签 tag
避免被爬,先贴上本帖地址:struts2 官方系列教程一:使用struts2 标签 tag http://www.cnblogs.com/linghaoxinpian/p/6901316.html 本 ...
- 理解Queue队列中join()与task_done()的关系
在网上大多关于join()与task_done()的结束原话是这样的: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目5
2014-03-18 01:40 题目:对字符串进行类似游程编码的压缩,如果压缩完了长度更长,则返回不压缩的结果.比如:aabcccccaaa->a2b1c5a3,abc->abc. 解法 ...
- 【Perceptron Learning Algorithm】林轩田机器学习基石
直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...
- Robot Framwork +Selenium2环境搭建
Robot Framwork +Selenium2环境搭建 安装python 参考文章http://blog.csdn.net/sealion111/article/details/78690686 ...
- eclipse importing maven projects 卡顿
导入一个maven工程后 一直显示 importing maven projects 9% 解决办法: 找到eclipse安装目录下的eclipse.ini 在最后加入 -vm $JAVA_HOME% ...
- glance参数
Image service property keys https://docs.openstack.org/python-glanceclient/latest/cli/property-keys. ...
- win10下乌龟git安装和使用
一.安装git for windows 首先下载git for windows客户端http://msysgit.github.io/ 安装过程没什么特别的,不停next就ok了 图太多就不继 ...
- 爬虫:Scrapy16 - Spider Contracts
Scrapy 通过合同(contract)的方式来提供了测试 spider 的集成方法. 可以硬编码(hardcode)一个样例(sample)url,设置多个条件来测试回调函数处理 response ...
- DAO设计模式的理解
为了降低耦合性,提出了DAO封装数据库操作的设计模式. 它可以实现业务逻辑与数据库访问相分离.相对来说,数据库是比较稳定的,其中DAO组件依赖于数据库系统,提供数据库访问的接口. 一般的DAO的封装由 ...