希尔排序

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

时间复杂度:根据步长而不同,最优时间复杂度: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写排序算法的更多相关文章

  1. 优雅的python 写排序算法

    arr=[] while True: #输入数据 当输入q结束 a=raw_input() if a=="q": break arr.append(int(a)) s=len(ar ...

  2. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  3. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  4. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  5. python常见排序算法解析

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

  6. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  7. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  8. python之排序算法

    排序是每个语言都需要学会的,不管是c++.java还是python,套路都是类似的 python中也有自带的排序函数sort,直接使用也可 闲来无事写了几个排序算法,各不相同 1.每次遇到最小的数都交 ...

  9. python选择排序算法总结

    选择排序算法: a=[6,5,4,3,2,1] 算法思路: 第一步:在列表的第一个位置存放此队列的最小值 声明一个变量min_index等于列表的第一个坐标值0 从第一个位置0坐标开始,和它后边所有的 ...

随机推荐

  1. Java编程思想:文件读写实用工具

    import java.io.*; import java.util.ArrayList; import java.util.Arrays; public class Test { public st ...

  2. 跨站脚本攻击(selfxss)笔记(三)

    本篇纯文字发表自己对自插型xss的看法 selfxss,顾名思义,自己输入xss脚本,输出仅自己看到,仅xss到自己. 常见的有:查询框的xss.某个账号中,添加自己的分组类等 查询框的xss: 即在 ...

  3. Linux下程序下载

    每个开发板/PC机都有硬盘(ROM,read only memory,只读存储器)和运行内存(RAM,random access memory,随机存取存储器).其中Nand/Nor flash相当于 ...

  4. mimalloc内存分配代码分析

    这篇文章中我们会介绍一下mimalloc的实现,其中可能涉及上一篇文章提到的内容,如果不了解的可以先看下这篇mimalloc剖析.首先我们需要了解的是其整体结构,mimalloc的结构如下图所示   ...

  5. [Windows无法连接到 System Event Notification Service服务]解决方案

    我之前使用Windows的过程的有出现过以下问题,之前因为比较急就匆忙解决了没来得及把解决方法写下来. 正好今天有个朋友电脑也出现此问题过来找我寻求解决方法,便把解决方法写了下来. 电脑出现的问题,如 ...

  6. tablayout_不能左右滑动问题小计

    <android.support.design.widget.TabLayout android:id="@+id/tab_pic" android:layout_width ...

  7. TensorFlow笔记-组件

    张量 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更代表的就是一种 ...

  8. linux下的FTP安装及调优

    前言: 在之前交换平台的开发中,FTP的各种操作算是核心功能点. 在FTP的开发中,遇到了不少坑. 如FTP需要设置被动模式,否则10M以上的包可能会上传失败. 如FTP需要设置囚牢模式,否则访问的文 ...

  9. asp.net core 系列之静态文件

    这篇讲解asp.net core中的静态文件(大致翻译于官网). 静态文件,例如HTML,CSS, images和JavaScript. 要想直接被客户端访问,需要做一些配置. 一.Serve sta ...

  10. 【Demo 1】基于object_detection API的行人检测 2:数据制作

    项目文件结构 因为目录太多又太杂,而且数据格式对路径有要求,先把文件目录放出来.(博主目录结构并不规范) 1.根目录下的models为克隆下来的项目.2.pedestrian_data目录下的路径以及 ...