python常见的排序算法_常见排序算法之python实现
1. 冒泡排序
时间复杂度为O(n^2), 稳定的排序算法
思路:一开始比较的区间是【0,n-1】,依次比较相邻两数,哪个数大哪个数就放在后面,这样一次遍历数组后,最大的数会在数组的最后一个位置,然后比较区间从【0,n-1】缩小到了【0,n-2】,在进行一次遍历下来,第二大的数会被放在数组倒数第二的位置,依次类推。直到把范围缩小到一个数的时候,数组就有序了。
defbubbleSort(arr):length=len(arr)for i in range(length-1):#趟数
for j in range(length-i-1):#每趟元素数
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]return arr
2. 选择排序
时间复杂度为O(n^2),不稳定的排序算法
思路:一开始从【0,n-1】选出一个最小值放在位置0上;第二次从【1,n-1】上选择一个最小值放在位置1上;依次类推;直到数组访问剩下一个元素时,数组有序了。
defselectionSort(arr):"""选择排序"""length=len(arr)for i inrange(length):
min_i= i #最小值索引
for j inrange(i, length):if arr[min_i] >arr[j]:
min_i=j
arr[min_i], arr[i]=arr[i], arr[min_i]return arr
3. 插入排序*
时间复杂度为O(n^2),稳定的排序算法
注:当数组几乎有序的情况下,时间复杂度为O(n*k),k为最多移动的距离;当数组逆序时,时间复杂度最大为O(n^2)
思路:把n个待排序的元素看成是一个有序表和一个无序表,开始时有序表只有一个元素,无序表有n-1个元素。排序过程中每次从无序表中取出一个元素,把它的排序码依次与有序表中元素比较(后->前),将它插入有序表的适当位置,使之成为新的有序表。
definsertSort(arr):"""插入排序"""length=len(arr)for i in range(length-1):
o_i= i #有序表最后一个元素索引
u_v = arr[o_i+1] #无序表的元素值
while o_i >= 0 and arr[o_i] >u_v:
arr[o_i+1] =arr[o_i]
o_i-= 1arr[o_i+1] = u_v #带插入元素合适位置,+1是因为前面-1
return arr
4. 归并排序*
时间复杂度为O(nlogn),稳定的排序算法
思路:首先让数组每一个元素成为长度为1的有序区间;然后将两个长度为1的有序区间进行合并,生成长度为2的有序区间;然后再将两个长度为2的有序区间进行合并,生成长度为4的有序区间;依次类推,直至数组有序。1合2,2合4,4合8,8合16,……。
defmergerSort(arr):"""归并排序
划分成左右两部分; 两两合并,成有序数组"""
if len(arr) <= 1:returnarr
mid= len(arr) // 2
#左右划分, 生成长度为1的有序数组时开始返回
leftArr =mergerSort(arr[:mid])
rightArr=mergerSort(arr[mid:])#两两合并
returnmerger(leftArr, rightArr)defmerger(left, right):"""合并两个有序数组,形成新的有序数组返回"""res=[]
l, r=0, 0while l < len(left) and r
res.append(left[l])
l+= 1
else:
res.append(right[r])
r+= 1res+=left[l:]
res+=right[r:]return res
5. 快速排序**
时间复杂度为O(nlogn), 不稳定的排序算法
注:在数组完全无序的情况下,快排效果最好,为O(nlogn);在有序情况下效果最差,为O(n^2)。
思路:随机排序 - 在数组中随机选择一个数,使得数组中大于它的数放在它的右边、小于等于它的数放在它的左边,然后左右两边的数递归的调用快排的过程。
快排的一次划分过程 - 时间复杂度为O(n):
首先,我们随机选择数组中的一个作为划分值;然后把划分值与数组的最后一个元素进行交换,使得划分值放到数组的最后一个位置(如b);然后我们定义一个小于等于区间,初始时,小于等于区间为空,放在数组的最左边(如c);然后开始遍历数组,如果元素大于划分值,继续遍历下一个元素,如果元素值小于等于划分值,就让该元素与小于等于区间的下一个元素进行交换,扩增小于等于区间(如d,e);依次执行这个过程,直到数组中只剩一个数;然后数组最后一个数(划分值)与小于等于区间的下一个数进行交换,快排的一次划分过程就结束了(如f,g)。
defquickSort(arr, left, right):"""快速排序
对left到right区间上的数组进行快排"""
if left >=right:returnNone
midValue= arr[(left+right)//2] #划分值
l, r =left, rightwhile l
while arr[r] > midValue: r -= 1
if l >= r: breakarr[l], arr[r]=arr[r], arr[l]
r-= 1l+= 1
if l ==r:
l+= 1r-= 1
if left l: quickSort(arr, l, right)return None
6. 堆排序*
时间复杂度:O(nlogn),不稳定的排序算法,常用于查找top x
思路:首先将数组【0,n-1】区间上的所有元素构建大根堆,然后将堆顶元素与数组最后一个元素进行交换,这样数组最后一个元素为最大值,作为数组有序部分存在下来;然后将数组【0,n-2】区间上的所有元素构建大根堆,然后执行堆顶元素与数组的倒数第二个元素进行交换,这样数组后两位元素分别是数组的最大值和第二大的值存在下来;然后将数组区间【0,n-3】区间构建大根堆,交换;重复以上过程直到数组有序。
defheapSort(arr):"""堆排序"""arr=buildMaxHeap(arr)for i in list(range(len(arr)))[::-1]:
arr[0], arr[i]=arr[i], arr[0]
adjustHeap(arr, 0, i)#n表示数组的大小(不是堆)
returnarrdefbuildMaxHeap(arr):"""建立大根堆
从下向上构建"""
for i in list(range(len(arr)//2))[::-1]:
adjustHeap(arr, i, len(arr))returnarrdefadjustHeap(arr, start, size):"""将数组[start:]调整成堆结构
参数
---
start: int
数组起始index
size:int
数组大小"""lChild= 2 * start + 1rChild= 2 * start + 2maxi=startif maxi < size//2: #说明有孩子
if lChild < size and arr[lChild] >arr[maxi]:
maxi=lChildif rChild < size and arr[rChild] >arr[maxi]:
maxi=rChildif maxi != start: #== 说明已经是最大堆了,所以这里不是
arr[maxi], arr[start] =arr[start], arr[maxi]
adjustHeap(arr, maxi, size)
7. 希尔排序
时间复杂度为O(nlogn),不稳定的排序算法
思路:希尔排序是插入排序的改良,希尔排序相比于插入排序区别在于步长是逐步调整的,也就是希尔排序在执行完指定步长的插入排序后,逐渐调整步长,直至执行步长为1的插入排序为止。一般来说,初始步长gap=length/2,然后不断以gap=gap/2减小步长,直至降为1。希尔排序的成败和步长的选取相关,步长选取越优时间复杂度越低,步长选取越劣时间复杂度越是接近O(n^2)。
defshellSort(arr):"""希尔排序
使用希尔增量"""n=len(arr)
gap= n // 2 #初始化步长
while gap >= 1:for i inrange(gap, n):
index=iwhile index >=gap:if arr[index-gap] >arr[index]:
arr[index-gap], arr[index] = arr[index], arr[index-gap]
index-=gapelse:breakgap//= 2 #缩减步长
return arr
python常见的排序算法_常见排序算法之python实现相关推荐
- 【Matlab】智能优化算法_蜻蜓优化算法DA
[Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...
- 【Matlab】智能优化算法_蚁狮优化算法ALO
[Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...
- 【Matlab】智能优化算法_灰狼优化算法GWO
[Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...
- java常见的排序算法_常见排序算法及Java实现
先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...
- 常见排序算法_解释的算法-它们是什么以及常见的排序算法
常见排序算法 In its most basic form, an algorithm is a set of detailed step-by-step instructions to comple ...
- java数字排序方法_常见的数据排序方法
排序,顾名思义,就是将一组无序的数据按照指定的顺序(一般是从大到小或从小到大)进行排列的过程.不管是在Java还是在JavaScript.PHP.C/C++等编程语言中,对数组(或集合)进行排序都是程 ...
- python排序链表快速排序算法_八大排序之快速排序算法-python实现
快排就是折中时间和空间的一个算法,可以说是较为高效的算法,平时用用他没啥大问题. 自己也看到个比较形象生动的例子,为了让大家能够看的比较清楚,我就直接转过来给大家看了哈!但是我使用python实现的: ...
- 会排序吗_洗牌算法详解:你会排序,但你会打乱吗?
预计阅读时间: 8 分钟 我知道大家会各种花式排序,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验 ...
- 解释什么是快速排序算法?_解释排序算法
解释什么是快速排序算法? Sorting algorithms are a set of instructions that take an array or list as an input and ...
- 快速排序算法_常用排序算法专题—快速排序
黑客技术点击右侧关注,了解黑客的世界! Linux编程点击右侧关注,免费入门到精通! 程序员严选甄选正品好物,程序员生活指南! 作者丨就是彬彬呀https://www.jianshu.com/p/17 ...
最新文章
- 三圆相交阴影部分面积_这题要证明圆的切线并求阴影面积,分割图形求面积法是解题关键...
- 常用模块(数据序列化 json、pickle、shelve)
- vue使用html渲染组件,Vue.js在渲染组件之前填充数据
- Qt UDP的初步使用
- php求链表中位数,先给伸手党的php链表遍历求和
- 2022中国物联网行业研究报告
- Maven 每次update之后自动修改jdk问题
- 一些大厂的css reset 代码
- asp,net 读写cookie(个人笔记)
- Fastlane基础介绍
- 2020家用千兆路由器哪款好_2020家用路由器推荐
- PHP在线手册 中文版
- 彩虹色MD主题1 for Sublime Text Typora EmEditor EverEdit
- 为什么有的域名需要加WWW才能访问?
- 不是python文件操作的相关函数_从零开始学Python(七):文件存储I/O流和异常捕捉
- 苹果个人账号转公司账号
- 【知识兔】Excel教程之隔行/隔列求和
- ios swiftui_ios swiftui中的本地化
- 3.空间域图像处理入门
- 从最简单的ROE和PB的角度去选股