用python写排序算法
希尔排序
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
时间复杂度:根据步长而不同,最优时间复杂度:O(n),平均时间复杂度:根据步长而不同
def shell_sort(lst):
h=1
N=len(lst)
while h<N/3 :
h=3*h+1
while h>=1:
for i in range (h,N,1):
while i>=h and lst[i-h]>lst[i]:
lst[i-h],lst[i]=lst[i],lst[i-h]
i-=h
h=int(h/3)
print(lst)
if __name__== "__main__":
lst=[1,3,4,1,3,7,8,2,123,4,2]
shell_sort(lst)
归并排序 merge
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
时间复杂度:O(nlogn),最优时间复杂度:O(n),平均时间复杂度:O(nlogn),空间复杂度O(n)
自顶向下的归并排序
#自顶向下
def merge(lst):
merge_sort(lst,0,len(lst)-1)
print(lst)
def merge_sort(lst,right,left):
if right>=left: return;
mid=(right+left)//2
merge_sort(lst,right,mid)
merge_sort(lst,mid+1,left)
sort(lst,right,mid,left)
def sort(lst,right,mid,left):
#lst_copy[right:left]=lst[right:left]
lst_copy=lst[right:left+1]
# print(lst_copy)
# print("change")
#############这里要先赋值 m ,n 在for之前################
m=right;n=mid+1;
for i in range(right,left+1):
if m>mid:
lst[i]=lst_copy[n-right]
n+=1
elif n>left:
lst[i]=lst_copy[m-right]
m+=1
elif lst_copy[m-right]>=lst_copy[n-right]:
lst[i]=lst_copy[n-right]
n+=1
else :
lst[i]=lst_copy[m-right]
m+=1
# print(lst)
# print("end")
if __name__== "__main__":
lst=[12,10,23,14,34,5,6,3,2,7,10,54]
merge(lst)
堆排序
1.创建最大堆(Build_Max_Heap):将堆所有数据重新排序
2.堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
时间复杂度:O(nlogn),最优时间复杂度:O(nlogn),平均时间复杂度:O(nlogn)
def heap(lst):
N=len(lst)
for i in range(N//2,0,-1):
sink(lst,i,N)
#print(lst)
while N>0:
lst[0],lst[N-1]=lst[N-1],lst[0]
N=N-1
sink(lst,1,N)
def sink(lst,k,N):
while 2*k<=N:
j=2*k
if j<N and lst[j-1]<lst[j]:
j=j+1
if lst[k-1]>lst[j-1]:
break;
lst[k-1],lst[j-1]=lst[j-1],lst[k-1]
k=j
if __name__== "__main__":
lst=[12,10,23,14,34,5,6,3,2,7,10,54]
heap(lst)
print(lst)
快速排序
1.从数列中挑出一个元素,称为"基准"(pivot),
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
时间复杂度:O(n^2),最优时间复杂度:O(nlogn),平均时间复杂度:O(nlogn) 快排的时间复杂度跟选取基准的方法有关,一下是默认选择了第一个元素作为基准,随机性较大。
可以在序列中选取开始中间结尾三个数的中位数作为基准,进行优化。
from random import randint
#include lst[left]
def quick(lst,l,r):
if l<r:
#可有可无 选择一个随机数和最后一位交换
pivot= randint(l,r)
lst[r],lst[pivot]=lst[pivot],lst[r]
split =partition(lst,l,r)
quick(lst,l,split-1)
quick(lst,split+1,r)
def partition(array, l, r):
x = array[r]
i = l - 1
for j in range(l, r):
if array[j] <= x:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i+1]
return i + 1
if __name__== "__main__":
lst=[12,10,23,14,34,5,6,3,2,7,10,54]
quick(lst,0,len(lst)-1)
print(lst)
用栈来实现quick排序
#用栈来解决快速排序
def quick_sort(array, l, r):
if l >= r:
return
stack = []
stack.append(l)
stack.append(r)
while stack:
high = stack.pop()
low = stack.pop()
if high - low <= 0:
continue;
x = array[high]
i = low - 1
for j in range(low, high):
if array[j] <= x:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[high] = array[high], array[i + 1]
stack.extend([low, i, i + 2, high])
if __name__== "__main__":
lst=[12,10,23,14,34,5,6,3,2,7,10,54]
quick_sort(lst,0,len(lst)-1)
print(lst)
用python写排序算法的更多相关文章
- 优雅的python 写排序算法
arr=[] while True: #输入数据 当输入q结束 a=raw_input() if a=="q": break arr.append(int(a)) s=len(ar ...
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- Python实现排序算法之快速排序
Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- python之排序算法
排序是每个语言都需要学会的,不管是c++.java还是python,套路都是类似的 python中也有自带的排序函数sort,直接使用也可 闲来无事写了几个排序算法,各不相同 1.每次遇到最小的数都交 ...
- python选择排序算法总结
选择排序算法: a=[6,5,4,3,2,1] 算法思路: 第一步:在列表的第一个位置存放此队列的最小值 声明一个变量min_index等于列表的第一个坐标值0 从第一个位置0坐标开始,和它后边所有的 ...
随机推荐
- python的@修饰符
‘@’引用已有的函数,对下面的函数进行修饰.引用函数必须放在修饰函数的上面,引用函数的返回值,返回给被修饰的函数 一个简单的栗子: def funA(fn): print('A') # 输出A fn( ...
- 【基础算法模拟+例题】-C++
在漫长的刷题练习过程中,几乎所有稍微熟练一点的OIer都会,但是都几乎没有经过系统的学习,今天,我们就来讲讲模拟算法,也是为了复习emm. 定义? 定义?模拟还有什么定义吗? 那什么是模拟呢? 就是按 ...
- [记录]Nginx配置实现&&和||的方法实例
Nginx配置文件中if的&&和||的实现(nginx不支持&&和||的写法) 1.与(&&)的写法: set $condiction '';if ($ ...
- http://www.jianshu.com/p/2dd54ec0bb43 程序员纪录片
http://www.jianshu.com/p/2dd54ec0bb43 程序员纪录片
- 洛谷P1140 相似基因
题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...
- findBugs英文代号的对照表
findBugs错误英文翻译rule.findbugs.IMSE_DONT_CATCH_IMSE.name=不良实践 - 捕获可疑IllegalMonitorStateException rule.f ...
- ListView在ScrollView中不显示全部的问题
在实际应用中,我们可能会遇到把ListView放到ScrollView中的情况,在这种情况下,ListView的滑动属性与ScrollView的滑动出现冲突,从而ListView只显示一项.这里提供一 ...
- C#控制台打开VM虚拟机
添加引用->VixCOM.dll (在vix文件夹下) VixWrapper.cs using System; using System.Collections.Generic; using S ...
- python中的字典,if_while使用
1.定义两个字典用于表述你的个人信息 第一个字典存放你的这些信息:姓名.性别.年龄.身高第二个字典存放你的其他信息:性格.爱好.座右铭将两个字典合并为第三个字典之后,打印出来 觉得自己很年轻的,可以去 ...
- Java 面向对象面试题
1.Java面向对象的三种特性 封装:封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口进行访问. Java的四种访问控制符: - 默认的(default):不使用任何修饰符,在同 ...