最简单的排序有三种:插入排序,选择排序和冒泡排序。这三种排序比较简单,它们的平均时间复杂度均为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实现常见排序算法的更多相关文章

  1. python 的常见排序算法实现

    python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...

  2. python实现常见排序算法

    #coding=utf-8from collections import deque #冒泡排序def bubblesort(l):#复杂度平均O(n*2) 最优O(n) 最坏O(n*2) for i ...

  3. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  4. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  5. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  6. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  7. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  8. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

随机推荐

  1. jax-ws实现WebService

    关于WebService有很多框架了,CXF,Spring自己的webservice等等,因为cxf实际也是依赖spring的servlet,这里说明一下jax-ws,使用原生的servlet实现. ...

  2. ul ol dl

    1.ul是无序列表,也就是说没有排列限制可以随意加li: <ul> <li>可以随意放置</li> <li>可以随意放置</li> < ...

  3. CentOS 6.4 64位 搭建MySQL-Cluster 7.3.8 集群

    准备:1.下载 MySQL-Cluster-gpl-7.3.8-1.el6.x86_64.rpm-bundle.tar 下载地址: http://mirrors.sohu.com/mysql/MySQ ...

  4. CentOS 6下安装nodejs 0.9.0

    确保安装了python,大部分安装失败都是由于python版本过低导致.安装之前,升级python版本,升级步骤 http://www.tomtalk.net/wiki/Python. [root@S ...

  5. C#如何释放已经加载的图片 (转)

    使用Image.FromFile取磁盘上的图片时,这个方法会锁定图片文件,而且会导致内存占用增大, 有几种方法解决: 一:将Image类转换成Bitmap类 System.Drawing.Image ...

  6. npm install express -g出错

    npm ERR! Windows_NT npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program ...

  7. Android DropBoxManager Service

    Android DropBoxManager Service 什么是 DropBoxManager ? Enqueues chunks of data (from various sources – ...

  8. void (*f(int, void (*)(int)))(int) 函数解析 转

    今天与几个同学看到了一个函数指针定义: void (*f(int, void (*)(int)))(int) 以前在C trap pit fails里面见过,但是文章里面介绍的很详细,但是往往使初学者 ...

  9. Loading CSS without blocking render

    The principles behind these techniques aren't new. Filament group, for example, have published great ...

  10. Unity3d 物理 Rigidbody预防穿插

    Unity3d 物理 Rigidbody预防穿插 @广州小龙 Unity的物理引擎采用的是Physx引擎,里面的组件是Rigidbody!这个可以模拟物理效果! Rigidbody,这个是可以进行穿插 ...