当前位置: 首页 > news >正文

算法的10大排序

10大排序算法--python

  • 一颗星--选择排序
  • 一颗星--冒泡排序
  • 一颗星--插入排序
  • 两颗星--归并排序(递归-难)
  • 三颗星--桶排序
  • 三颗星--计数排序
  • 四颗星--基数排序
  • 四颗星--快速排序,寻找标志位(递归-难)
  • 四颗星--又是比较难的希尔排序
  • 五颗星--堆排序

谁教你这么剪的 | 11大排序的原理讲解和Python源码剖析_哔哩哔哩_bilibili

一颗星–选择排序

自己看代码都能看懂

def xuanze_paixu(bb):  
n=len(bb)  
for i in range(n-1):  
# 优化代码  
min=i  for j in range(i+1,n):  
if bb[i]> bb[j]:  
# 优化代码  
min=j  
bb[i], bb[min] = bb[min], bb[i]  # bb[i],bb[j]=bb[j],bb[i]  
return bb  a=[0,4,0,9,2,8,4,0,1,8]  
c=xuanzhe_paixu(a)  
print(c)

一颗星–冒泡排序

自己看代码都能看懂

def maopao_paixu(bb):  
n=len(bb)  
# 左闭右开且递减  
for i in range(n-1,-1,-1):  
for j in range(0,i):  
if bb[j]>bb[j+1]:  
bb[j],bb[j+1]= bb[j+1],bb[j]  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1,8,7,4,9,1,8,4,7,9]  
result=maopao_paixu(a)  
print(result)

一颗星–插入排序

def charu_paixu(bb):  
n=len(bb)  
for i in range(1,n):  
x=bb[i]  
j=i-1  
# 用j的话比较清除  
while j>=0:  
if x< bb[j]:  
bb[j+1]=bb[j]  
else:  
break  
bb[j]=x  
j = j - 1  
return bb  
a=[7,3,9,8,7,4,9,4,2,4,1]  
b=charu_paixu (a)  
print(b)

两颗星–归并排序(递归-难)

直接给我cpu干蒙了
视频解释
排序算法:归并排序【图解+代码】_哔哩哔哩_bilibili
代码如下,有两种,多参考参考

def merge(a, start, mind, end):  
l = start  
bb = []  
right = mind + 1  while l <= mind and right <= end:  
if a[l] <= a[right]:  
bb.append(a[l])  
l += 1  
else:  
bb.append(a[right])  
right += 1  bb.extend(a[l:mind+1])  
bb.extend(a[right:end+1])  for j in range(start, end+1):  
a[j] = bb[j - start]  print(start, end, bb)  def divide(a, start, end):  
if start == end:  
return  mind = (start + end) // 2  
divide(a, start, mind)  
divide(a, mind+1, end)  
merge(a, start, mind, end)  a = [7, 3, 9, 8, 7]  
divide(a, 0, 4)  # 第二种  
# 因为在Python中,列表是可变的数据类型,也就是说,当你传递一个列表到一个函数中时,你实际上是传递了这个列表的引用,而不是它的副本。这意味着如果你在函数中修改了这个列表,那么这个改变将会影响到原始的列表。
def merge_sort(arr, start, end):  
if start >= end:  
return  
mid = (start + end) // 2  
merge_sort (arr, start, mid)  
merge_sort (arr, mid + 1, end)  
merge (arr, start, mid, end)  def merge(arr, start, mid, end):  
left = arr[start:mid + 1]  
right = arr[mid + 1:end + 1]  i = j = 0  
k = start  while i < len (left) and j < len (right):  
if left[i] <= right[j]:  
arr[k] = left[i]  
i += 1  
else:  
arr[k] = right[j]  
j += 1  
k += 1  while i < len (left):  
arr[k] = left[i]  
i += 1  
k += 1  while j < len (right):  
arr[k] = right[j]  
j += 1  
k += 1  a = [6, 1, 4, 1, 7]  
merge_sort (a, 0, len (a) - 1)  
print (a)

值得好好研究和阅读,比较像递归和分治

三颗星–桶排序

这个还是比较好理解的

from xuanzhe_paixu import xuanzhe_paixu as slect  
def tong_paixu(a):  
Min=min(a)  
Max=max(a)  
bucket_len=(Max-Min)//3+1 #将计算长度的线段分出来算出每个桶的长度  
bucket= [[] for _ in range(3)]  
for sum in a:  
bucket[(sum-Min)//bucket_len].append(sum) # 相减能够计算线段,相除能够计算几倍桶长度  
bb=[]  
for arry in bucket:  
result=slect(arry)  
print(result)  
for i in result:  
bb.append(i)  
return bb  
b=[6,4,7,1,8,6,4,8,7]  
d=tong_paixu(b)  
print(d)

三颗星–计数排序

def jisu_paixu(arry):  
Max=max(arry)+1  
b=[0]*Max  
a=[]  
for each in arry:  
b[each]+=1  
for index,i in enumerate(b):  
if i!=0:  
for j in range(i):  
a.append(index)  
print(a)  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
jisu_paixu(d)  # 第二种  
def jisu_paixu1(arry):  
Max = max (arry) + 1  
b = [0] * Max  
for each in arry:  
b[each]+=1  
print(b)  
c=[]  
for index in range(Max):  
while b[index] >0:  
c.append(index)  
b[index]-=1  
return c  
d=[7,6,4,7,4,5,1,8,5,7,4,3,9,5,7,2,9,8,5,7,9,2,8,5,77,43,9]  
result=jisu_paixu1(d)  
print(result)

四颗星–基数排序

就是将得到的列表通过迭代,实现每次少一个数,将最后一个数按数字放入对应的桶中,需要创建一个二维列表,和清空一个二维列表,这个很重要

a = [[] for _ in range (10)]  
for i in range (10):  
a.append ([])  
def jisu_paixu(arry):  
a=[]  
Max=max(arry)  
base=1  
for i in range (10):  
a.append ([])  
while base<Max:  
n=0  
for each in arry:  
a[each//base%10].append(each)  
print(a)  
for list1 in a:  
for i in list1:  
arry[n]=i  
n+=1  
print(arry)  
base*=10  
a = [[] for _ in range (10)]  
b=[3,214,1,24,13]  
jisu_paixu(b)

四颗星–快速排序,寻找标志位(递归-难)

 def kuaisu_paixu(a,start,end):  if start==end:  return  flag=start  binaliang=start+1  for i in range(start+1,end):  if a[flag]>a[i]:  a[i],a[binaliang]=a[binaliang],a[i]  binaliang+=1  a[flag],a[binaliang-1]=a[binaliang-1],a[flag]     flag=binaliang-1  print(a[flag],a[start:flag],a[flag+1:end])  kuaisu_paixu(a,start,flag)  kuaisu_paixu(a,flag+1,end)  a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  kuaisu_paixu(a,0,len(a))  print(a)  # 第二种办法  import random
def kuaisu_paixu(a,start,end):  
# random_index=random.randint(start,end-1)  
# a[start],a[random_index]=a[random_index],a[start]
# 这个是用来随机快速排序的
flag=start  
binaliang=start+1  
for i in range(start+1,end):  
if a[flag]>a[i]:  
a[i],a[binaliang]=a[binaliang],a[i]  
binaliang+=1  
a[flag],a[binaliang-1]=a[binaliang-1],a[flag]  
flag=binaliang-1  
print(a[flag],a[start:flag],a[flag+1:end])  
return flag  
def paixu(a,start,end):  if start==end:  
return  flag=kuaisu_paixu(a,start,end)  
paixu(a,start,flag)  
paixu(a,flag+1,end)  
a=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
paixu(a,0,len(a))  
print(a)

四颗星–又是比较难的希尔排序

这里面有两种方式,一个是切片排序,一个是从头排序
还有希尔排序就是特殊的插入排序,一定要多了解了解,加理解

# 希尔排序就是特殊的插入排序,间隔不在是1,而是gap和cha  
def xier_paixu(a):  
n=len(a)  
gap=n//2  
while gap>0:  
for i in range(gap,n):  
j=i  
while j>=gap:  
if a[j]<a[j-gap]:  
a[j],a[j-gap]=a[j-gap],a[j]  
else:  
break  
j-=gap  gap=gap//2  
a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
xier_paixu(a)  
print(a)  # 第二种  
def xier_paixu1(alist, start, end):  
n = end - start  
cha = n // 2  
while cha > 0:  
for i in range(cha + start, end):  
j = i  
while j >= start+cha:  
if alist[j] < alist[j - cha]:  
alist[j], alist[j - cha] = alist[j - cha], alist[j]  
else:  
break  
j -= cha  
cha //= 2  return alist  a = [4, 7, 1, 9, 8, 4, 7, 9, 8, 1, 2, 7, 4, 9, 8, 1, 2, 4, 7, 1, 9, 84]  
start = 2  
end = len(a)  
print(xier_paixu1(a, start, end))

五颗星–堆排序

## 创建一个列表去执行大顶堆操作,便于排序  
def fangwen_paixu(arry):  
arry=[None]+arry  
# 将列表进行自顶向下的堆排序,不能超过索引  
for i in range(len(arry)//2,0,-1):  
dui_paixu(arry,i,len(arry)-1)  
# 将最顶堆顶端的数与最低端的数交换放入列表中,不断缩小最低端的索引 
for i in range(len(arry)-1,0,-1):  
arry[i],arry[1]=arry[1],arry[i]  
dui_paixu(arry,1,i-1)  
return arry  
# 创建堆排序函数  
##  
def dui_paixu(a, start, end):  
head=start  
jiedian=start*2  
while(jiedian<=end):  
# 寻找叶子节点最大的值,与头节点比较,将最大的值放入到头节点中  
if jiedian+1<=end and a[jiedian]<a[jiedian+1]:  
jiedian+=1  
if a[head]<a[jiedian]:  
a[head],a[jiedian]=a[jiedian],a[head]  
# 进行迭代,最后遍历完整个数组,形成大顶堆  
head,jiedian=jiedian,jiedian*2  
else:  
break
# 创建一个测试fangwen_paixu函数  
b=[4,6,5,3,6,5,3,6,7,7,3,2,4,9,8,4,8,9,2,4,8,9,3,1,3,9]  
c=fangwen_paixu(b)  
#把c列表里面的NONE去掉  
c.pop(0)  
print(c)

记得多看视频多理解理解,反复观看

相关文章:

算法的10大排序

10大排序算法--python 一颗星--选择排序一颗星--冒泡排序一颗星--插入排序两颗星--归并排序&#xff08;递归-难&#xff09;三颗星--桶排序三颗星--计数排序四颗星--基数排序四颗星--快速排序&#xff0c;寻找标志位&#xff08;递归-难&#xff09;四颗星--又是比较难的希尔排…...

“十道机器学习问题,帮助你了解基础知识和常见算法“

目录 简介&#xff1a; 1. 什么是机器学习&#xff1f;它与传统编程有什么不同之处&#xff1f;2. 请解释监督学习和无监督学习的区别。3. 什么是过拟合和欠拟合&#xff1f;如何解决这些问题&#xff1f;4. 请解释交叉验证在机器学习中的作用。5. 什么是特征选择&#xff1f;为…...

部署WAF安全应用防火墙(openresty部署)

使用NGINX+Openresty实现WAF功能 一、了解WAF 1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用 防火墙 是通过执行一系列针对HTTP/HTTPS的 安全策略 来专门为Web应用提供保…...

yml转properties工具

目前搜索到的大部分代码都存在以下问题&#xff1a; 复杂结构解析丢失解析后顺序错乱 所以自己写了一个&#xff0c;经过不充分测试&#xff0c;基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外&#xff0c;还可以生成代码、sql转json等&#xff0c;可…...

zerotier 搭建 moon中转服务器 及 自建planet

搭建moon 服务器 环境准备 # 安装依赖 yum install wget gcc gcc-c git -y yum install json-devel -y# 下载及安装 curl -s https://install.zerotier.com/ | sudo bash节点ID 配置 配置moon.json文件 cd /var/lib/zerotier-one/# 导出依赖 zerotier-idtool initmoon ide…...

深入了解Rabbit加密技术:原理、实现与应用

一、引言 在信息时代&#xff0c;数据安全愈发受到重视&#xff0c;加密技术作为保障信息安全的核心手段&#xff0c;得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法&#xff0c;具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨&#xff0c;分析…...

Linux常用命令——mv命令

文章目录 1. 简介2. 命令格式3. 主要参数4. 常见用法及示例4.1 移动文件4.2 重命名文件4.3 交互式移动文件4.4 强制移动文件4.5 移动多个文件4.6 使用通配符移动文件 5. 注意事项6. 结论 1. 简介 mv 命令在Linux系统中用于移动文件或目录&#xff0c;同时也可以用于重命名文件…...

Panalog 日志审计系统 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统&#xff0c;方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sy_query.php接口处存在远程命令执行漏洞&#xff0c;攻击者可执行任意命令&#xff0c;接管服务器权限。 0x03 复现环境 FOFA&#xf…...

Android设置文字颜色渐变

项目中用到了很多文字颜色渐变的设计&#xff0c;因此做一下记录。 核心代码如下&#xff1a; /*** 统一文字渐变色设置* param colors 渐变色字符串数组* param positions 渐变色位置数组&#xff0c;可为空* param start 渐变起始点&#xff0c;可为空* param end 渐变结束…...

java基础面试题(二)

java后端面试题大全 3.JVM3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?3.2 java类的加载流程3.3 java内存溢出什么时候会发生以及解决方法 3.JVM 3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置? 堆 对象实例、String常量池、基…...

php爬虫实现把目标页面变成自己的网站页面

最近又被烦的不行&#xff0c;琐事不断&#xff0c;要是比起懒来一个人比一个人懒&#xff0c;但是懒要转换成动力啊&#xff0c;能让自己真正的偷懒&#xff0c;而不是浪费时间。每天还是需要不断的学习的&#xff0c;才能更好的提高效率&#xff0c;把之前做的简单小功能爬虫…...

[c语言c++]手写你自己的swap交换函数

函数传参有按值传递&#xff0c;指针传递&#xff0c;引用传递&#xff0c;分别看一下三种情况下的交换函数如何书写&#xff0c;应该使用哪种最方便。 当书写一个交换两个值的 swap 函数时&#xff0c;我们可以分别使用按值传参、指针传参和引用传参的方式来实现。下面是示例和…...

技术类知识汇总(二)

在自己日常学习javaweb的过程中&#xff0c;做的一些笔记和总结&#xff0c;汇总如下&#xff1a; Springboot项目的静态资源(html&#xff0c;css&#xff0c;js等前端资源)默认存放目录为&#xff1a;classpath:/static classpath:/public classpath:/resources"三层架…...

简单好用!日常写给 ChatGPT 的几个提示词技巧

ChatGPT 很强&#xff0c;但是有时候又显得很蠢&#xff0c;下面是使用 GPT4 的一个实例&#xff1a; 技巧一&#xff1a;三重冒号 """ 引用内容使用三重冒号 """&#xff0c;让 ChatGPT 清晰引用的内容&#xff1a; 技巧二&#xff1a;角色设定…...

pytorch分布式训练

1 基本概念 rank&#xff1a;进程号&#xff0c;在多进程上下文中&#xff0c;我们通常假定rank 0是第一个进程或者主进程&#xff0c;其它进程分别具有1&#xff0c;2&#xff0c;3不同rank号&#xff0c;这样总共具有4个进程 node&#xff1a;物理节点&#xff0c;可以是一个…...

【PyTorch】(三)模型的创建、参数初始化、保存和加载

文章目录 1. 模型的创建1.1. 创建方法1.1.1. 通过使用模型组件1.1.2. 通过继承nn.Module类 1.2. 模型组件1.2.1. 网络层1.2.2. 函数包1.2.3. 容器 1.3. 将模型转移到GPU 2. 模型参数初始化3. 模型的保存与加载3.1. 只保存参数3.2. 保存模型和参数 1. 模型的创建 1.1. 创建方法…...

高效开发之:判断复杂list中的对象属性是否包含某个值

技术使用&#xff1a;使用了Java 8引入的Stream API以及Optional类。这些特性用于简化集合的处理和减少空指针异常。 List<ResourceInfoDto> authData chatBase.getData();String baseName dto.getBaseName();Optional<ResourceInfoDto> authWithResourceCode a…...

MacOS + Android Studio 通过 USB 数据线真机调试

环境&#xff1a;Apple M1 MacOS Sonoma 14.1.1 软件&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 3 设备&#xff1a;小米10 Android 13 一、创建测试项目 安卓 HelloWorld 项目: 安卓 HelloWorld 项目 二、数据线连接手机 1. 手机开启开发者模式 参考&#xff1…...

部署jekins遇到的问题

jdk问题 我用的jdk版本是21的结果版本太新了&#xff0c;启动jekins服务的时候总是报错最后在jekins的安装目录下面的jekinsErr.log查看日志发现是jdk问题最后换了一个17版本的就解决了。 unity和jekins jekins和Git源码管理 jekins和Git联动使用 我想让jekins每次打包的时…...

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入&#xff0c;主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据&#xff0c;使用Insert语句插入性能较低&#xff0c;此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用

Linux 内存管理调试分析&#xff1a;ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础&#xff0c;但这一子系统结构复杂&#xff0c;常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题&#xff0c;需要一套工具化、…...