希尔排序

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

时间复杂度:根据步长而不同,最优时间复杂度:O(n),平均时间复杂度:根据步长而不同def shell_sort(lst):

h=1

N=len(lst)

while h

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

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

#可有可无 选择一个随机数和最后一位交换

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写排序算法相关推荐

  1. python比javascript快多少_为什么Python比C++慢很多?

    话说为什么大家会集中讨论GIL?在这里题主的标准线是一个按bit处理的单线程DFS啊--几乎没有GIL发挥的余地好么-- 这个八皇后的DFS,我的C++代码在不加某些评估性剪枝的情况下对15需要算18 ...

  2. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  3. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  4. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  5. 算法设计与分析——十大经典排序算法二(6--10)

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.3.1 Las ...

  6. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  7. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  8. python bp神经网络 异或_【神经网络】BP算法解决XOR异或问题MATLAB版

    第一种 %% %用神经网络解决异或问题 clear clc close ms=4;%设置4个样本 a=[0 0;0 1;1 0;1 1];%设置输入向量 y=[0,1,1,0];%设置输出向量 n=2 ...

  9. python求梅森尼数_谈谈梅森旋转:算法及其爆破

    https://liam.page/https://liam.page/https://liam.page/ 现代编程语言,大都在标准库中包含了随机库.例如,C++ 在 C++11 标准中添加了 ra ...

最新文章

  1. Node.js中的express框架,修改内容后自动更新(免重启),express热更新
  2. [五] JavaIO之InputStream OutputStream简介 方法列表说明
  3. cmake用法及常用命令总结(全)
  4. Mysql学习(一)之简单介绍
  5. python中用函数货币转换代码_python将人民币转换大写的脚本代码
  6. 里程碑!中文版.NET官网发布,.NET开发起飞!
  7. php mysql 拆分join_PHP拼接Sql,MySql拆分数据(substring_index())作为判断条件
  8. 玩转matlab之一维 gauss 数值积分公式及matlab源代码
  9. MVC自学系列之四(MVC模型-Models)
  10. Centos下telnet的安装和配置
  11. 代理服务器反向代理varnish配置文件解析
  12. 跨地域为同事广播幻灯片
  13. 无聊特意去拍月亮。呵呵
  14. 23种设计模式(二十)数据结构之迭代器
  15. [hdu1532]最大流
  16. vss服务器状态失败_VSS常犯错误(转载)
  17. 当前时间距离某个时间的天数计算_计算某个日期和当前时间的天数差
  18. 网页加载Java特别慢_打网页打开速度慢,教你3分钟解决
  19. 为什么选择语音验证码?
  20. 握手定理(握手数之和为偶数)和相关2个推论

热门文章

  1. Python文件操作与函数目录
  2. 2017 济南综合班 Day 2
  3. Tween Animation----Translate位置移动动画
  4. Spring-Security (学习记录二)--修改为自己的登录页面
  5. codevs1026 逃跑的拉尔夫(搜索)
  6. 【原】PSD图标素材的全自动切图方法,适用于IOS、安卓、web前端等领域
  7. 面向对象思想----不看懊悔!
  8. MSSql ID自动增长删除数据重1开始
  9. Jquery 小技巧
  10. android 内存分析 郭霖_android 内存泄漏(OOM)问题总结