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)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
 
随机推荐
- VS Extension+NVelocity系列(一)——构建一个简单的NVelocity解析环境
			
一.前言 本节我们将实际实现一个简单的NVelocity解析环境,以便为以后的实例做一些基本工作,虽然NVelocity如何使用已经属于老掉牙的话题,但我只能专门挑出来一章来做铺垫.人生就是这样无奈啊 ...
 - python学习笔记十五:日期时间处理笔记
			
#-*- coding: utf-8 -*- import datetime #给定日期向后N天的日期 def dateadd_day(days): d1 = datetime.datetime.no ...
 - JavaScript中最常用的55个经典技巧,没事的时候看看,拓展解决问题的思路
			
都转烂了,不过还是贴上来了.查的时候方便... test 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 & ...
 - 查看Linux系统用户登录日志
			
日志: /var/log/wtmp说明: 此文件是二进制文件,查看方法如下:该日志文件永久记录每个用户登录.注销及系统的启动.停机的事件.因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加 ...
 - 把SVN版本控制讲给 非IT同事 听
			
场景: 什么是版本: 什么是版本控制: 为什么要用版本控制: 推荐使用SVN: 如何快速理解SVN: SVN简单使用:
 - Linux大小端模式转换函数
			
转自 http://www.cnblogs.com/kungfupanda/archive/2013/04/24/3040785.html 不同机器内部对变量的字节存储顺序不同,有的采用大端模式(bi ...
 - HDU 4699 Editor(双向链表)
			
双向链表直接模拟. 用一个辅助数组maxSum来维护一下前k项中[1,k]的最大和. 因为光标是一格一格的移动,所以每次光标右移的时候动态更新一下即可. 时间复杂度O(n). #include < ...
 - 第二阶段团队冲刺-two
			
昨天: 处理第一次启动服务器500的问题. 今天: 修复博客作业查询功能. 遇到的问题: 无.
 - android ViewGroup  getChildDrawingOrder与 isChildrenDrawingOrderEnabled()
			
getChildDrawingOrder与 isChildrenDrawingOrderEnabled()是属于ViewGroup的方法. getChildDrawingOrder 用于 返回当前 ...
 - 201621123033 《Java程序设计》第7周学习总结
			
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源:事件发生的场所,具体指各个组件. 事件:组件 ...