发布于2019-08-07 13:00 阅读(1057) 评论(0) 点赞(1) 收藏(3)
冒泡
#标准版本
def bubble_sort(array):
n = len(array)
for i in range(n): # i从0到n
for j in range(1, n-i): # 1开始,即j-1=0开始
if array[j-1] > array[j]:
array[j-1], array[j] = array[j], array[j-1]
return array
#优化版本
def bubble_sort2(array):
n = len(array)
for i in range(n):
flag = 1 #标记
for j in range(1,n-i):
if array[j-1] > array[j] :
array[j-1],array[j] = array[j],array[j-1]
flag = 0
if flag : #标记为正,说明以上的都排好了,以后的迭代没意义了
break
return array
#优化版本2
def bubble_sort(array):
n=len(array)
k=n
for i in range(n):
flag=True
for j in range(1,k):
if array[j-1]>array[j]:
array[j-1],array[j]=array[j],array[j-1]
k=j #记录最后交换的位置,后面的都排好了。
flag=False
if flag:
break
return array
选择排序
def selection_sort(array): #每次把序列中的最小值换到最前面
n = len(array) #因为记录index交换少,所以性能略优于冒泡
for i in range(n):
minIndex = i
for j in range(i+1, n):
if array[j] < array[minIndex]:
minIndex = j
array[i], array[minIndex] = array[minIndex], array[i]
return array
插入排序
def insert_sort(array): #假设有概率序列初始状态就是局部有序,那么插入排序比冒泡和选择好。
n=len(array)
for i in range(1,n):
if array[i-1]>array[i]: #这句可以不要
num=array[i]
index=i
for j in range(i-1,-1,-1):
if array[j]>num:
array[j+1]=array[j] #往后移动
index=j #腾出来的原来的位置就变成了可插入的位置被记录
else:
break
array[index]=num
return array
希尔排序
def shell_sort(array):
n=len(array)
gap=round(n/2) #设置gap
while gap>0:
for i in range(gap,n): #这里相当于跨着步子的插入排序
num=array[i]
index=i
while index>=gap and array[index-gap]>num:
array[index]=array[index-gap]
index=index-gap
array[index]=num
gap=round(gap/2)
return array
归并排序
def merge_sort(array): # 递归
if len(array) <= 1: return array # python每次都是新的数组,可以用数组长度小于等于1来判断
num = len(array) // 2 # py27 3/2和3//2相同,python3 3//2才是地板除
left = merge_sort(array[:num])
right = merge_sort(array[num:])
return merge(left, right)
def merge(left, right): # 合并
l,r = 0,0
result = []
while l < len(left) and r < len(right):
if left[l] < right[r]:
result.append(left[l])
l = l + 1
else:
result.append(right[r])
r += 1
# 一边没有之后,加上所有的
result += left[l:]
result += right[r:]
return result
快排
def quick_sort(array):
"""快速排序"""
if len(array) >= 2: # 递归入口及出口
mid = array[len(array) // 2] # 选取基准值,也可以选取第一个或最后一个元素
left, right = [], [] # 定义基准值左右两侧的列表
array.remove(mid) # 从原始数组中移除基准值
for num in array:
if num >= mid:
right.append(num)
else:
left.append(num)
return quick_sort(left) + [mid] + quick_sort(right)
else:
return array
堆排序
def adjust_heap(heap,heapsize,father):
left=2*father+1 #计算左儿子index
right=father+1 #计算右儿子index
large=father #最大值的index先默认为爸爸
if left<heapsize and heap[large]<heap[left]:
large=left
if right<heapsize and heap[large]<heap[right]:
large=right
if large!=father: #如果有最大值的index有调整,再交换
heap[large],heap[father]=heap[father],heap[large]
adjust_heap(heap,heapsize,large) #继续向下调整
def heap_sort(array):
n=len(array)
for father in range(((n-1)-1)//2,-1,-1): #计算出最后一个父节点,然后一步一步往前遍历前面的父节点
adjust_heap(array,n,father)
for i in range(n-1,-1,-1):
array[0],array[i]=array[i],array[0] #根结点(最大值)放最后一个
adjust_heap(array,i,0) #继续从根结点开始调整
return array
排序方法 | 最好情况 | 最坏情况 | 平均情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 稳定 |
插入排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
希尔排序 | O(n1.3) | O(n2) | O(nlogn)−O(n2) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
快速排序 | O(nlogn) | O(n2) | O(nlogn) | O(logn)−O(n) | 不稳定 |
作者:erer34
链接:https://www.pythonheidong.com/blog/article/11105/95185bfacc45a51dc811/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!