用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坐标开始,和它后边所有的 ...
随机推荐
- bzoj1052 9.20考试 第二题 覆盖问题
1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2004 Solved: 937[Submit][Statu ...
- Q&A-20180128
Orleans与Akka对比,为什么选用Orleans? 答: Akka对参与开发的人员要求更高一些,普遍是专家级别,Orleans框架进一步抽象了一层,结合C#语言特性,能普遍降低开发难度. 下面是 ...
- dbo是默认用户也是架构
dbo是默认用户也是架构 dbo作为架构是为了更好的与2000兼容, 在2000中DataBaseName.dbo.TableName解释为:数据库名.用户名.表名, 在2005中DataBaseNa ...
- Windows10 OpenSSH 快捷设置 避免 Bad owener or permission on
配置ssh 有两个地方 ~/.ssh/config 这个亲测失败,怎么搞都报错 bad owner .... c:/programdata/ssh/ssh_config 亲测有效 (显示隐藏文件才看的 ...
- Python解释器安装教程以及环境变量配置 以及 pycharm的安装与激活
计算机的组成 主板:人的骨架,用于拓展设备 CPU:人的大脑,用于计算和逻辑处理 硬盘:存储数据(永久储存),比如电脑上的 C盘,D盘 内存:临时记忆(断电即消失) 操作系统:XP win7 win1 ...
- duilib加消息
一.加消息 1. public INotifyUI, 2. void Notify(TNotifyUI& msg); 3. Notify实现 4. m_pManager->AddNoti ...
- 个人永久性免费-Excel催化剂功能第50波-批量打印、导出PDF、双面打印功能
在倡导无纸化办公的今天,是否打印是一个碍眼的功能呢,某些时候的确是,但对于数据的留存,在现在鼓吹区块链技术的今天,仍然不失它的核心价值,数据报表.单据打印出来留存,仍然是一种不可或缺的数据存档和防篡改 ...
- Tiny Counting
也许更好的阅读体验 样例一 输入 4 1 4 3 2 输出 3 样例二 输入 5 9 1 0 0 5 输出 8 题解 这是本人自己想了2个半小时才想出来的方法,稍稍有点复杂但是很好理解 题目的意思就是 ...
- vue.js 中组件的使用
Vue中组件的使用 方式一 1.使用Vue.extend创建组件 var com1 = Vue.extend({ template: '<h3>这是使用 Vue.extend 创建的组件& ...
- Maven重新下载未下载完成的jar包
使用maven下载jar包,经常会遇到下载失败的情况,如果失败的jar包过多,或是不清楚到底有那些jar包在下载过程中出现了问题.可通过maven命令重新批量下载未成功的jar包. 1,打开cmd , ...