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实现相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. java常见的排序算法_常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

  5. 常见排序算法_解释的算法-它们是什么以及常见的排序算法

    常见排序算法 In its most basic form, an algorithm is a set of detailed step-by-step instructions to comple ...

  6. java数字排序方法_常见的数据排序方法

    排序,顾名思义,就是将一组无序的数据按照指定的顺序(一般是从大到小或从小到大)进行排列的过程.不管是在Java还是在JavaScript.PHP.C/C++等编程语言中,对数组(或集合)进行排序都是程 ...

  7. python排序链表快速排序算法_八大排序之快速排序算法-python实现

    快排就是折中时间和空间的一个算法,可以说是较为高效的算法,平时用用他没啥大问题. 自己也看到个比较形象生动的例子,为了让大家能够看的比较清楚,我就直接转过来给大家看了哈!但是我使用python实现的: ...

  8. 会排序吗_洗牌算法详解:你会排序,但你会打乱吗?

    预计阅读时间: 8 分钟 我知道大家会各种花式排序,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验 ...

  9. 解释什么是快速排序算法?_解释排序算法

    解释什么是快速排序算法? Sorting algorithms are a set of instructions that take an array or list as an input and ...

  10. 快速排序算法_常用排序算法专题—快速排序

    黑客技术点击右侧关注,了解黑客的世界! Linux编程点击右侧关注,免费入门到精通! 程序员严选甄选正品好物,程序员生活指南! 作者丨就是彬彬呀https://www.jianshu.com/p/17 ...

最新文章

  1. 三圆相交阴影部分面积_这题要证明圆的切线并求阴影面积,分割图形求面积法是解题关键...
  2. 常用模块(数据序列化 json、pickle、shelve)
  3. vue使用html渲染组件,Vue.js在渲染组件之前填充数据
  4. Qt UDP的初步使用
  5. php求链表中位数,先给伸手党的php链表遍历求和
  6. 2022中国物联网行业研究报告
  7. Maven 每次update之后自动修改jdk问题
  8. 一些大厂的css reset 代码
  9. asp,net 读写cookie(个人笔记)
  10. Fastlane基础介绍
  11. 2020家用千兆路由器哪款好_2020家用路由器推荐
  12. PHP在线手册 中文版
  13. 彩虹色MD主题1 for Sublime Text Typora EmEditor EverEdit
  14. 为什么有的域名需要加WWW才能访问?
  15. 不是python文件操作的相关函数_从零开始学Python(七):文件存储I/O流和异常捕捉
  16. 苹果个人账号转公司账号
  17. 【知识兔】Excel教程之隔行/隔列求和
  18. ios swiftui_ios swiftui中的本地化
  19. 3.空间域图像处理入门
  20. 从最简单的ROE和PB的角度去选股

热门文章

  1. ios中一个开发者证书如何创建多个app应用
  2. eclipse 中的 maven run configurations
  3. Factory模式与Prototype模式的异同
  4. 进程、线程与应用程序域
  5. 数据结构和算法-001 数组
  6. “火柴棍式”程序员面试题
  7. MVC,三层架构,工厂模型,七层
  8. MFC的进程和线程,非正常终止
  9. 源码解析 React Hook 构建过程
  10. 深度学习中将类别标签映射到one_hot向量