用Python实现常见排序算法
最简单的排序有三种:插入排序,选择排序和冒泡排序。这三种排序比较简单,它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了。贴出来源代码。
插入排序:
def insertion_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(1, iter_len):
key = sort_list[i]
j = i - 1
while j >= 0 and sort_list[j] > key:
sort_list[j+1] = sort_list[j]
j -= 1
sort_list[j+1] = key
return sort_list
冒泡排序:
def bubble_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(iter_len-1):
for j in range(iter_len-i-1):
if sort_list[j] > sort_list[j+1]:
sort_list[j], sort_list[j+1] = sort_list[j+1], sort_list[j]
return sort_list
选择排序:
def selection_sort(sort_list):
iter_len = len(sort_list)
if iter_len < 2:
return sort_list
for i in range(iter_len-1):
smallest = sort_list[i]
location = i
for j in range(i, iter_len):
if sort_list[j] < smallest:
smallest = sort_list[j]
location = j
if i != location:
sort_list[i], sort_list[location] = sort_list[location], sort_list[i]
return sort_list
平均时间复杂度为O(nlogn)的算法有:归并排序,堆排序和快速排序。
#快排
def quickSort(lists):
if len(lists)<=1:
return lists
pivot = lists.pop()
left = []
right = []
for i in lists:
if i<pivot:
left.append(i)
else:
right.append(i)
return quickSort(left)+[pivot]+quickSort(right)
#归并排序
def mergesort(lists):
if len(lists)<=1:
return lists
mid = int(len(lists)/2)
left = lists[:mid]
right = lists[mid:]
mergesort(left)
mergesort(right)
return merge(left,right)
def merge(left,right):
i,j = 0,0
result = []
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
while(i<len(left)):
result.append(left[i])
i+=1
while(j<len(right)):
result.append(right[j])
j+=1
return result
#排序算法集合
import random
#冒泡排序
def BubbleSort(lists):
for i in range(0,len(lists)):
for j in range(0,len(lists)-1-i):
if lists[j]>lists[j+1]:
lists[j],lists[j+1] = lists[j+1],lists[j]
return lists
#选择排序
def selectionSort(lists):
for i in range(len(lists)):
min = i
for j in range(i+1,len(lists)):
if lists[j]<lists[min]:
min = j
if min != i:
lists[min],lists[i] = lists[i],lists[min]
return lists
#插入排序
def insertSort(lists):
for i in range(1,len(lists)):
key = lists[i]
j = i-1
while j>=0 and key<lists[j]:
lists[j+1] = lists[j]
j -= 1
lists[j+1]=key return lists
#希尔排序
def shellSort(lists):
count = len(lists)
step = 2
group = int(count/step)
while group>0:
for i in range(group):
j = i+group
while j<count:
key = lists[j]
k = j-group
while k>=0:
if key<lists[k]:
lists[k+group]=lists[k]
lists[k] = key
k -= group
j+=group
group = int(group/2)
return lists
#快排
def quickSort(lists):
if len(lists)<=1:
return lists
pivot = lists.pop()
left = []
right = []
for i in lists:
if i<pivot:
left.append(i)
else:
right.append(i)
return quickSort(left)+[pivot]+quickSort(right)
#归并排序
def mergesort(lists):
if len(lists)<=1:
return lists
mid = int(len(lists)/2)
left = lists[:mid]
right = lists[mid:]
left = mergesort(left)
right = mergesort(right)
return merge(left,right)
def merge(left,right):
i,j = 0,0
result = []
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
while(i<len(left)):
result.append(left[i])
i+=1
while(j<len(right)):
result.append(right[j])
j+=1
return result
#归并排序
def mergeSort(lists): mid = int(len(lists)/2)
left,right = lists[:mid],lists[mid:]
if len(left)>1:left = mergeSort(left)
if len(right)>1:right = mergeSort(right)
res = []
# while left and right:
# if left[-1]>=right[-1]:
# res.append(left.pop())
# else:
# res.append(right.pop())
# res.reverse()
#return (left or right) + res
while left and right:
if left[0]<=right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
return res+(left or right)
def adjust_heap(lists,i,size):
lchild = 2*i+1
rchild = 2*i+2
max = i
if i<size/2:
if lchild<size and lists[lchild]>lists[max]:
max = lchild
if rchild>size and lists[rchild]>lists[max]:
max = rchild
if max != i:
lists[max],lists[i] = lists[i], lists[max]
adjust_heap(lists,max,size)
def build_heap(lists,size):
for i in range(0,int(size/2))[::-1]:
adjust_heap(lists,i,size)
def heap_sort(lists):
size = len(lists)
build_heap(lists,size)
for i in range(0,size)[::-1]:
lists[0],lists[i] = lists[i],lists[0]
adjust_heap(lists,0,i)
return lists if __name__ =='__main__':
lists = [random.randint(1,20) for n in range(10)]
#print(lists)
#print(sorted(lists))
#print(lists)
#print(BubbleSort(lists))
#print(lists)
#print(selectionSort(lists))
#print(lists)
#print(insertSort(lists))
#print(lists)
#print(shellSort(lists))
#print(lists)
#print(mergesort(lists))
#print(lists)
#print(quickSort(lists))
#print(lists)
#print(mergeSort(lists))
print(lists)
print(heap_sort(lists))
用Python实现常见排序算法的更多相关文章
- python 的常见排序算法实现
python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...
- python实现常见排序算法
#coding=utf-8from collections import deque #冒泡排序def bubblesort(l):#复杂度平均O(n*2) 最优O(n) 最坏O(n*2) for i ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- python——常见排序算法解析
算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- JS常见排序算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript版几种常见排序算法
今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...
随机推荐
- 【转】ASP.NET常用数据绑定控件优劣总结
转自:http://www.cnblogs.com/Olive116/archive/2012/10/24/2736570.html ASP.NET常用数据绑定控件优劣总结 本文的初衷在于对Asp ...
- ThinkPHP调试模式与日志记录
1.可以在config.php中进行设置,默认为关闭状态. 'APP_DEBUG' => true 打开\ThinkPHP\Common\debug.php文件可以查看debug的默认设置 ...
- jQuery仿苏宁易购导航
最近看了些网上的各类导航网站源码,自己学习制作了一个仿苏宁易购的导航栏 jQuery部分代码 $(function(){ $(".CategoryTree>ul>li" ...
- 从外国html5网站上扒来一个鼠标经过的css3 效果,感觉很不错
鼠标经过的时候,感觉有点像一张纸卷上去的感觉. 下面是代码 <div class="main-container types"> <div class=" ...
- Java连接mySql—JDBC连接数据库
利用JDBC开发数据库 经典应该用框架: 第一步,加载JDBC数据库驱动程序(不同的数据库有不同的数据库驱动,所以在连接数据库之前,需加载驱动) 格式: String driver = "c ...
- AS3.0定义变量的访问范围
在AS3.0中变量的默认访问范围是:internal:包内成员可以访问,包外不可访问.AS2.0默认访问范围是public
- 【pyhton】短路逻辑
编程语言常用的逻辑if a and b:#如果a是false,那么跳过b的判断,结果直接falseif a or b:#如果a为true,那么跳过b的判断,直接true
- Visual c++ 2012 软件错误
vs2012 未能正确加载"Visual C++ Language Manager Package"包 解决办法 如下图所示: 到官网下载更新即可. http://www.micr ...
- 2016030204 - git和github结合
1.下载和安装git客户端 参考:http://www.cnblogs.com/zhtzyh2012/p/5232291.html 2.github上创建项目 参考:http://www.cnblog ...
- 如何通过数据库修改WordPress后台登录密码
大家是否有过因为忘记WordPress后台登陆密码的时候?其实WordPress后台登陆密码的找回或修改的方法有多种,比如通过邮箱重启密码,又或者通过主机控制面板进入数据库修改等等.本篇教程以GoDd ...