各种排序算法-用Python实现
冒泡排序
# 冒泡排序
def bubble_sort(l):
length = len(l)
# 外层循环 length遍,内层循环少一遍
while length:
for j in range(length - 1):
# 找出最大值,然后交换位置到最后
if l[j] > l[length - 1]:
l[j], l[length - 1] = l[length - 1], l[j]
length -= 1
if __name__ == "__main__":
l = [5, 1, 9, 3, 2, 7]
bubble_sort(l)
print l
插入排序
"""
插入排序和冒泡排序的区别在于:
插入排序的前提是:左边是有序的数列
而冒泡排序:相邻的值进行交换,一共进行n次交换
"""
def insert_sort(l):
# 循环 除第一个数字组成的有序数组 以外的数字
for i in range(1, len(l)):
# 每一个数字,依次和有序数组进行比较
print l[:i]
for j in range(len(l[:i])):
if l[i] < l[j]:
l[i], l[j] = l[j], l[i]
if __name__ == "__main__":
l = [5, 1, 9, 3, 2, 7]
print l
insert_sort(l)
print("result: " + str(l))
归并排序
def MergeSort(lists):
if len(lists) <= 1:
return lists
num = int(len(lists) / 2)
# 从中间,进行数据的拆分, 递归的返回数据进行迭代排序
left = MergeSort(lists[:num])
right = MergeSort(lists[num:])
print left
print "*" * 20
print right
print "_" * 20
return Merge(left, right)
def Merge(left, right):
r, l = 0, 0
result = []
while l < len(left) and r < len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += right[r:]
result += left[l:]
print 'result:', result
return result
if __name__ == "__main__":
print MergeSort([1, 2, 3, 4, 5, 6, 7, 90, 21, 23, 45])
快速排序
def quick_sort(l, start, end):
i = start
j = end
# 结束排序
if i >= j:
return
# 保存首个数值
key = l[i]
# 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序
while i < j:
# 和最右边的比较,如果>=key,然后j-1,慢慢的和前一个值比较;如果值<key,那么就交换位置
while i < j and key <= l[j]:
print key, l[j], '*' * 30
j -= 1
l[i] = l[j]
# 交换位置后,然后在和最左边的值开始比较,如果<=key,然后i+1,慢慢的和后一个值比较;如果值>key,那么就交换位置
while i < j and key >= l[i]:
print key, l[i], '*' * 30
i += 1
l[j] = l[i]
l[i] = key
# 左边排序
quick_sort(l, start, j-1)
# 右边排序
quick_sort(l, i+1, end)
if __name__ == "__main__":
l = [5, 1, 9, 3, 2, 7]
quick_sort(l, 0, len(l) - 1)
print l
选择排序
"""
选择排序和冒泡排序的区别在于:
选择排序的前提是:找到最大值的位置,最后才进行1次交换
而冒泡排序:相邻的值进行交换,一共进行n次交换
"""
def selection_sort(l):
length = len(l) - 1
while length:
index = length
# 第一个数字,和后面每一个数字进行对比,找出最大值,放到最后!!
for j in range(length):
if l[j] > l[index]:
index = j
l[length], l[index] = l[index], l[length]
print len(l) - length, l
length -= 1
if __name__ == "__main__":
l = [5, 1, 9, 3, 2, 7]
print l
selection_sort(l)
print("result: " + str(l))
希尔排序
def insert_sort(l, start, increment):
for i in range(start+increment, len(l), increment):
for j in range(start, len(l[:i]), increment):
if l[i] < l[j]:
l[i], l[j] = l[j], l[i]
print increment, '--',l
return l
def shell_sort(l, increment):
# 依次进行分层
while increment:
# 每一层,都进行n次插入排序
for i in range(0, increment):
insert_sort(l, i, increment)
increment -= 1
return l
if __name__ == "__main__":
l = [5, 2, 9, 8, 1, 10, 3, 4, 7]
increment = len(l)/3+1 if len(l)%3 else len(l)/3
print "开始", l
l = shell_sort(l, increment)
print "结束", l
树递归
class Node():
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def midRecusion(node):
if node is None:
return
midRecusion(node.left)
print node.value,
midRecusion(node.right)
def midIterator(node):
stack = []
while stack or node:
if node is not None:
stack.append(node)
node = node.left
else:
node = stack.pop(-1)
print node.value,
node = node.right
if __name__ == "__main__":
node = Node("D", Node("B", Node("A"), Node("C")), Node("E", right=Node("G", left=Node("F"))))
print('\n中序遍历<递归>:')
midRecusion(node)
print('\n中序遍历<迭代>:')
midIterator(node)
更新冒泡排序
'''
迭代使用的是循环结构。
递归使用的是选择结构。
'''
# 递归求解
def calculate(l):
if len(l) <= 1:
return l[0]
value = calculate(l[1:])
return 10**(len(l) - 1) * l[0] + value
# 迭代求解
def calculate2(l):
result = 0
while len(l) >= 1:
result += 10 ** (len(l)-1) * l[0]
l = l[1:]
return result
l1 = [1, 2, 3]
l2 = [4, 5]
sum = 0
result = calculate(l1) + calculate(l2)
# result = calculate2(l1) + calculate2(l2)
print(result)
各种排序算法-用Python实现的更多相关文章
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 十大经典排序算法总结 (Python)
作业部落:https://www.zybuluo.com/listenviolet/note/1399285 以上链接是自己在作业部落编辑的排序算法总结- Github: https://github ...
- 一些排序算法的Python实现
''' Created on 2016/12/16 Created by freeol.cn 一些排序算法的Python实现 @author: 拽拽绅士 ''' '''值交换''' def swap( ...
- 基本排序算法的Python实现
本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...
- 经典排序算法及python实现
今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法的python实现
十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.包括:冒泡排序.选择排序.归并排序.快速 ...
随机推荐
- servlet部署到tomcat中
引用:http://blog.csdn.net/shuidao/article/details/1738059 配置,部署 servlet: 1. 在tomcat的安装目录下 找到webapps 文件 ...
- caffe net 可视化工具,,层特征可视化
1.只用网络在线结构绘制可视化网络模型 http://ethereon.github.io/netscope/#/editor 将对应的网络输入到里面,然后按shift+enter即可查看对应的网络结 ...
- Linq中GroupBy方法的使用总结(转载)
from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...
- 网络摄像机进行互联网视频直播录像方案的选择,EasyNVS or EasyCloud or EasyGBS?
背景需求 互联网视频直播越来越成为当前大势:直播的需求往往都伴随在录像的需求,对于录像,不同的场景又有不同的方案选择: 本篇博客将会介绍对应的几种录像方案,可以帮助有互联网录像需求的用户进行对应的录像 ...
- PSSH 批量管理服务器
pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...
- an open source web server and reverse proxy
https://www.nginx.com/resources/admin-guide/ NGINX is an open source web server and reverse proxy th ...
- <2013 10 18> Linux随机数生成器可能确实存在安全弱点
生成随机数是密码学中的一项基本任务,是生成加密密钥和加密算法或加密协议所必不可少的.理想中的随机数是完美的,但实践中的随机数都是用伪随机数生成器(PRNG)生成,随机数的质量对安全性至关重要.安全专家 ...
- 任务03—简单程序测试及 GitHub Issues 的使用
任务三主要是测试别人的代码找bug,和根据别人提出的bug修改自己的代码. 首先是测试的对象是jinlinchao的代码,根据他的代码很容易发现几个问题,一开始,我是打算,将发现的问题一个一个提上去, ...
- 【转】 HMC与VIOS对新LPAR提供存储与网络虚拟化的支持
前面的几篇博文的操作环境都是在IVM下,IVM可以看作是VIOS的一部分,或者是对VIOS功能的一个扩展,一个IVM只能管理1台物理服务器,而HMC则是一对多.在有HMC来管理物理服务器的情形下,VI ...
- js四则运算符
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型.其他运算只要其中一方是数字,那么另一方就转为数字.并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串. & ...