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

每日一题之常见的排序算法

常见的排序算法

排序是最常用的算法,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、希尔排序和归并排序。除此之外,还有桶排序、堆排序、基数排序和计数排序。

1、冒泡排序

冒泡排序就是把小的元素往前放或大的元素往后放,比较的是相邻的两个元素。
时间复杂度: O ( n 2 ) O(n^2) O(n2),空间复杂度: O ( 1 ) O(1) O(1),稳定排序。
思想:
(1)比较相邻的两个元素,如果第一个比第二个大,就交换它俩的位置;
(2)对每一对相邻元素作同样的工作,从开始第一对到最后一对,一趟下来,最后的元素会是最大的数;
(3)针对所有的元素重复以上的步骤,除了最后一个;
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较。此时,该数组排好序。

def bubbleSort(list_1):len_1 = len(list_1)# 需要遍历的趟数for i in range(len_1):# 相邻元素的比较次数for j in range(len_1-i-1):# 如果第一个比第二个大,则交换两个元素的顺序if list_1[j]>list_1[j+1]:list_1[j], list_1[j+1] = list_1[j+1], list_1[j]return list_1				

改进后的排序算法,如果在一轮遍历中没有发生元素交换,就可以确定列表已经有序。可以修改冒泡排序函数,使其在遇到这种情况时提前终止。

def shortBubble(list_2):# 判断是否需要交换exchange = Falselen_2 = len(list_2)# 如果在一轮遍历中没有发生元素交换,则提前终止for i in range(len_2):exchange = Falsefor j in range(len_2-i-1):if list_2[j] > list_2[j+1]:list_2[j], list_2[j+1] = list_2[j+1], list_2[j]if not exchange:	breakreturn list_2

2、选择排序

选择排序给每个位置选择当前最小的元素。
算法思想:
(1)在所有数组中找到最小(大)元素,将其存放到数组的起始位置;
(2)在剩余元素中继续找最小(大)元素,然后依次放到已排序数组的末尾;
(3)重复操作,直到所有元素均排列好。
时间复杂度: O ( n 2 ) O(n^2) O(n2),空间复杂度: O ( 1 ) O(1) O(1),非稳定排序

def selectionSort(list_3):len_3 = len(list_3)for i in range(len_3):minIndex = ifor j in range(i+1, len_3):if list_3[j] < list_3[minIndex]:minIndex = jlist_3[i], list_3[minIndex] = list_3[minIndex], list_3[i]return list_3

3、插入排序

插入排序:在一个已经有序的小数组上,依次插入一个元素
算法思想:
(1)从第一个元素开始,该元素被认为是已经排好序的小数组;
(2)取出下一个元素,在已经排好序的小数组中从后向前遍历;
(3)如果排好序小数组的末尾元素大于待插入元素,将该末尾元素移动到下一个位置,并找小数组末尾元素的前面一个元素;
(4)重复步骤3,直到找到已排序的元素小于或等于待插入元素的位置;
(5)将待插入元素插入到该位置后,重复步骤2-5,直到该数组是有序的。
时间复杂度: O ( n 2 ) O(n^2) O(n2),空间复杂度: O ( 1 ) O(1) O(1),稳定排序

def insertionSort(list_4):len_4 = len(list_4)#遍历除第一个元素外的所有元素for i in range(1, len_4):# 若第i个元素大于i-1元素,直接插入if list_4[i] < list_4[i-1]:j = i - 1# 待插入元素value = list_4[i]while j >= 0 and value < list_4[j]:# 向后移动元素list_4[j+1] = list_4[j]j -= 1list_4[j+1] = valuereturn list_4

4、快速排序

快速排序:选取一个基准值,分成两段,左边放小于基准值的所有数,右边放大于基准值的数。
思想:
(1)选取基准值;
(2)将比基准值小的元素交换到前面,比基准值大的元素交换到后面;
(3)对左右区间重复步骤2,直到各区间只有一个数。

# 分区操作
def partition(alist, first, last):# 基准pivotVal = alist[first]# 左右两个leftMark = first + 1rightMark = lastflag = Falsewhile not flag:# 加大leftMark,直到遇到一个大于基准的元素while alist[leftMark] <= pivotVal and leftMark <= rightMark:leftMark += 1# 减少rightMark,直到遇到一个小于基准的元素while alist[rightMark] >= pivotVal and leftMark <= rightMark:rightMark -= 1# 当rightMark <leftMark时,过程终止if rightMark < leftMark:flag = Trueelse:#将rightMark对应的元素与当前位于分割点的元素互换alist[leftMark], alist[rightMark] = alist[rightMark], alist[leftMark]alist[leftMark], alist[rightMark] = alist[rightMark], alist[leftMark]return rightMarkdef quickSortHelper(alist, first, last):if first < last:mid = partition(alist, first, last)quickSortHelper(alist, first, mid)quickSortHelper(alist, mid+1, last)def quickSort(alist):quickSortHelper(alist, 0, len(alist)-1)

5、希尔排序

希尔排序是插入排序的一种变种,为了加快速度改进的插入排序,交换不相邻的元素以对数组的局部进行排序。
思想:
(1)让数组中任意间隔为 h h h 的元素有序;
(2)刚开始 h = l e n g t h / 2 h = length / 2 h=length/2
(3)接着让 h = l e n g t h / 4 h = length / 4 h=length/4,让 h h h 一直缩小,直到 h = 1 h=1 h=1,此时数组中任意间隔为1的元素有序。

# 对每个子序列进行插入排序,需要得到子序列的起始点和长度
def gapInsertSort(list_6, start, gap):for i in range(start+gap, len(list_6), gap):# 当前待插入元素curValue = list_6[i]j = i - gapif list_6[i] < list_6[i-gap]:while j >= 0 and curValue < list_6[j]:list_6[j+gap] = list_6[j]j -= gaplist_6[j+gap] = curValuereturn list_6def shellSort(list_6):# 获取每个子序列的长度subListLen = len(list_6) // 2# 子序列的长度要始终大于0while subListLen > 0:# 起始位置的取值for startPos in range(subListLen):# 分段进行插入排序gapInsertSort(list_6, startPos, subListLen)# 每次都将子序列的长度减少一半subListLen = subListLen // 2return list_6

6、归并排序

思想:将一个无序数组有序,首先将这个数组分成两个,然后对这两个数组分别进行排序,之后再把这两个数组合并成一个有序的数组。此时该数组就有序了。

# 合并两个有序数组
def merge(list_7, list_8):# 分别获取两个子序列的下标index1 = 0index2 = 0# 分别获取两个子序列的长度len_7 = len(list_7)len_8 = len(list_8)list_sum = []while index1 < len_7 or index2 < len_8:if list_7[index1] > list8[index2]:list_sum.append(list_8[index2])index2 += 1else:list_sum.append(list_7[index1])index1 += 1list_sum += list_7[index1:]list_sum += list_8[index2:]return list_sumdef mergeSort(list_9):# 原数组的长度不能少于2if len(list_9) < 2:return list_9# 进行二路归并mid = len(list_9) // 2# 左边进行归并排序left = merge(list_9[:mid])# 右边进行归并排序right = merge(list_9[mid:])return merge(left, right)

相关文章:

每日一题之常见的排序算法

常见的排序算法 排序是最常用的算法&#xff0c;常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、希尔排序和归并排序。除此之外&#xff0c;还有桶排序、堆排序、基数排序和计数排序。 1、冒泡排序 冒泡排序就是把小的元素往前放或大的元素往后放&#xff0c;比较…...

JVM 类加载和垃圾回收

JVM 1. 类加载1.1 类加载过程1.2 双亲委派模型 2. 垃圾回收机制2.1 死亡对象的判断算法2.2 垃圾回收算法 1. 类加载 1.1 类加载过程 对应一个类来说, 它的生命周期是这样的: 其中前 5 步是固定的顺序并且也是类加载的过程&#xff0c;其中中间的 3 步我们都属于连接&#xf…...

C++ 多线程

C 多线程 多线程是多任务处理的一种特殊形式&#xff0c;多任务处理允许让电脑同时运行两个或两个以上的程序 一般情况下&#xff0c;两种类型的多任务处理&#xff1a;基于进程和基于线程 基于进程的多任务处理是程序的并发执行基于线程的多任务处理是同一程序的片段的并发…...

深入理解JVM之.intern()的用法

intern只在常量池里记录首次出现的实例引用 来看一段代码 public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() st…...

idea报“Could not autowire. No beans of ‘UserMapper‘ type found. ”错解决办法

原因和解决办法 1.原因 idea具有检测功能&#xff0c;接口不能直接创建bean的&#xff0c;需要用动态代理技术来解决。 2.解决办法 1.修改idea的配置 1.点击file,选择setting 2.搜索inspections,找到Spring 3.找到Spring子目录下的Springcore 4.在Springcore的子目录下…...

QEMU源码全解析35 —— Machine(5)

接前一篇文章&#xff1a;QEMU源码全解析34 —— Machine&#xff08;4&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上回书说到有3…...

SpringBoot对一个URL通过method(GET、POST、PUT、DELETE)实现增删改查操作

目录 1. rest风格基础2. 开启方法3. 实战练习 1. rest风格基础 我们都知道GET、POST、PUT、DELETE分别对应查、增、改、删除 虽然Postman这些工具可以直接发送GET、POST、PUT、DELETE请求。但是RequestMapping并不支持PUT和DELETE请求操作。需要我们手动开启 2. 开启方法 P…...

webpack 创建VUE项目

1、安装 node.js 下载地址&#xff1a;https://nodejs.org/en/ 下载完成以后点击安装&#xff0c;全部下一步即可 安装完成&#xff0c;输入命令验证 node -vnpm -v2.搭建VUE环境 输入命令&#xff0c;全局安装 npm install vue-cli -g安装完成后输入命令 查看 vue --ver…...

deepin 深度操作系统正式适配苹果 M1 芯片

导读近日消息&#xff0c;据深度操作系统官方消息&#xff0c;在已经发布的 deepin V23 beta 版本中&#xff0c;深度操作系统正式适配 Apple Mac mini M1 了。 官方表示&#xff0c;Mac mini M1 是苹果于 2020 年 11 月发布的迷你电脑主机&#xff0c;它搭载了最高 3.2GHz …...

Labview控制APx(Audio Precision)进行测试测量(七)

处理集群控制子集 大多数用户不会想要设置所有的控制包括在一个大的控制集群&#xff0c;如水平和增益配置控制。例如&#xff0c;假设您只在 APx 中使用模拟不平衡输出连接器&#xff0c;而您想要做的就是控制发电机的电平和频率。在这种情况下&#xff0c;水平和增益配置集群…...

Mybatis 源码 ② :流程分析

文章目录 一、前言二、Mybatis 初始化1. AutoConfiguredMapperScannerRegistrar2. MapperScannerConfigurer3. ClassPathMapperScanner3.1 ClassPathMapperScanner#scan3.2 ClassPathMapperScanner#processBeanDefinitions 4. 总结 三、 Mapper Interface 的创建1. MapperFacto…...

Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识

文章目录 工具选择简单快捷键Game 窗口分辨率检视器Transform 组件Sprite Renderer综合检视器 工具选择 按下 QWERTY 可以选择不同的工具进行 旋转、定位、缩放 简单快捷键 按下 Ctrl D 可以复制物体 Game 窗口分辨率 16:9 为最常见的分辨率 检视器 Transform 组件 物体在…...

聚类与回归

聚类 聚类属于非监督式学习&#xff08;无监督学习&#xff09;&#xff0c;往往不知道因变量。 通过观察学习&#xff0c;将数据分割成多个簇。 回归 回归属于监督式学习&#xff08;有监督学习&#xff09;&#xff0c;知道因变量。 通过有标签样本的学习分类器 聚类和…...

了解IL汇编循环

IL代码&#xff0c; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 8.entrypoint.locals init (int32, int32)ldc.i4 4stloc.0 //Upper limit of the Loop, total 5 ldc.i4 0 stloc.…...

电脑突然黑屏的解决办法

记录一次电脑使用问题 问题描述 基本情况&#xff1a;雷神游戏笔记本 windows10操作系统 64位 使用时间 4年 日期&#xff1a;2023年8月11日 当时 电脑充着电 打开了两个浏览器&#xff1a;edge[页面加载5个左右]&#xff0c;火狐[页面加载1个左右] 两个文件夹 一个百度网盘…...

socket练习

socket练习 工具目的代码运行结果 工具 pycharm 目的 使用socket进行图片采集 代码 采集流程&#xff1a; 1 获取url 2 发送请求&#xff0c;获取数据 3 提取数据 4 保存数据 import socket import reurls [https://pic.netbian.com/uploads/allimg/220211/004115-1644511…...

Gitlab CI/CD笔记-第二天-主机套接字进行构建并push镜像。

一、安装gitlab-runner 1.可以是linux也可以是docker的 2.本文说的是docker安装部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…...

nginx服务器报错502 Bad Gateway的原因以及解决办法

服务器报错nginx 502 Bad Gateway的原因以及解决办法_502 bad gateway nginx_主题模板站的博客-CSDN博客...

带你了解什么是内容协商---如何返回不同媒体类型的数据

&#x1f600;前言 本篇博文是关于客户端接收能力不同&#xff0c;SpringBoot 返回不同媒体类型的数据如何处理的说明&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#…...

容器化相关面试题

Docker相关面试题 (1)Docker的组件包含哪些? 客户端:dockerclient服务端:dockerserver## 能看到相关的信息 docker info## docker client向docker daemon发送请求,docker daemon完成相应的任务,并把结果返还给容器 Docker镜像: docker镜像是一个只读的模板,是启动一…...

京东健康综合门诊望京开业,京东医疗路在何方?

​4月8日&#xff0c;京东健康综合门诊望京店正式开业。这是京东健康旗下首家同步开设专业体检、口腔诊疗、京东医美三大核心服务于一体的综合门诊。这标志着&#xff0c;京东健康体检中心在持续巩固中国专业体检“第三极”定位的基础上&#xff0c;进一步拓展至多元化健康管理…...

我用 AI 辅助开发了一系列小工具():文件提取工具窝

从0构建WAV文件&#xff1a;读懂计算机文件的本质 虽然接触计算机有一段时间了&#xff0c;但是我的视野一直局限于一个较小的范围之内&#xff0c;往往只能看到于算法竞赛相关的内容&#xff0c;计算机各种文件在我看来十分复杂&#xff0c;认为构建他们并能达到目的是一件困难…...

百度伐谋Agent 2.0登顶MLE,百度的板凳有多深?

上证报中国证券网讯&#xff0c;4月10日&#xff0c;记者从百度获悉&#xff0c;百度智能云推出的企业级算法自主优化智能体——百度伐谋Agent 2.0&#xff0c;再次登顶机器学习工程权威基准MLE-Bench&#xff0c;并刷新SOTA&#xff08;最优&#xff09;成绩。这是继去年10月首…...

Java的java.lang.StackWalker工具处理

Java的StackWalker工具&#xff1a;深入解析堆栈跟踪新方式 在Java开发中&#xff0c;堆栈跟踪是调试和问题排查的核心工具之一。传统的Throwable.getStackTrace()方法虽然简单&#xff0c;但存在性能开销大、灵活性不足的问题。Java 9引入的java.lang.StackWalker工具通过惰性…...

Linpeas使用教程

在Kali Linux的权限提升工具库中&#xff0c;Linpeas&#xff08;Linux Privilege Escalation Awesome Script&#xff09;是一款专注于Linux系统本地权限提升的自动化脚本工具&#xff0c;隶属于“PEASS&#xff08;Privilege Escalation Awesome Scripts SUITE&#xff09;”…...

Polycide vs. Salicide vs. Silicide: 工艺选择与电阻优化的深度解析

1. 半导体工艺中的硅化物技术&#xff1a;从基础到实战 在芯片制造过程中&#xff0c;金属硅化物技术就像电路中的"高速公路收费站"&#xff0c;直接影响着电流的通行效率。想象一下&#xff0c;当你开车经过收费站时&#xff0c;如果收费窗口太少或者收费员动作太慢…...

Java基础入门:方法详解

Java基础入门&#xff1a;方法详解 前言&#xff1a;掌握了Java变量、运算符、流程控制和数组后&#xff0c;你可能会遇到一个问题——重复编写相同的代码&#xff0c;比如多次计算两个数的和、多次打印数组元素&#xff0c;既繁琐又冗余。而「方法」就是Java中用来实现“代码复…...

Foxmail添加Gmail账号保姆级教程:如何绕过两步验证直接配置(2024最新版)

Foxmail高效配置Gmail全攻略&#xff1a;2024专属密码解决方案 每次登录Gmail都要反复输入验证码&#xff1f;Foxmail里添加Gmail账户总提示密码错误&#xff1f;这可能是2024年最让你抓狂的办公效率杀手之一。作为深度邮件使用者&#xff0c;我完全理解那种每天要处理十几个邮…...

香橙派AIPro散热实战:不花一分钱,用桌面小风扇把芯片温度从80℃压到40℃

香橙派AIPro零成本散热方案&#xff1a;从80℃到40℃的实战手记 香橙派AIPro作为一款高性能开发板&#xff0c;在运行AI推理或高负载任务时&#xff0c;芯片温度飙升是许多开发者头疼的问题。当温度超过80℃时&#xff0c;不仅会出现性能降频&#xff0c;甚至可能触发自动休眠保…...

从数据采集到回放验证:ADTF 适配 ROS 的 ADAS 测试实践胃

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) { private readonly SqlSource _source new(builder.DataSource); private readonly IParamQuery_accountQuery b…...