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

三大基础排序 -选择排序、冒泡排序、插入排序

排序算法

文章目录

  • 冒泡排序
    • 算法步骤
    • 动图
    • 代码
    • 优化
    • 总结
  • 选择排序
    • 算法步骤
    • 动图
    • 代码
    • 总结
  • 插入排序
    • 算法步骤
    • 动图
    • 代码
    • 总结

排序算法,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。一般默认排序是按照由小到大即升序排列。

冒泡排序

冒泡排序(Bubble Sort)简单的基于比较的排序算法。每次比较相邻两个元素,如果他们的顺序错误就把他们交换过来。由于较大的数据会不断地向上”冒“,所以以冒泡排序命名。

算法步骤

  • 从头开始,比较相邻元素,如果顺序不对,就交换。
  • 每次选出一个局部最大值
  • 走过n - 1 趟后,数组就有序了

动图

请添加图片描述

代码

public class P02_BubbleSort {public static void bubbleSort(int[] arr) {if(arr == null || arr.length < 2) {return;}for(int i = 0;i < arr.length - 1;i++) {for(int j = 0;j < arr.length - 1 - i;j++) {if(arr[j] > arr[j + 1]) {swap(arr,j,j + 1);}}}}public static void swap(int[] arr,int i,int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}public static void main(String[] args) {int[] arr = {9,8,7,6,5,4,3,2,1};bubbleSort(arr);System.out.println(Arrays.toString(arr));}
}

优化

 public static void bubbleSort(int[] arr) {if(arr == null || arr.length < 2) {return;}for(int i = 0;i < arr.length - 1;i++) {boolean success = false; for(int j = 0;j < arr.length - 1 - i;j++) {if(arr[j] > arr[j + 1]) {swap(arr,j,j + 1);success = true;}}if(success == false) {break;// 已经有序}}
}

总结

冒泡排序的时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1),冒泡排序是一种性能比较差的排序,如果不优化,那么无论是何种数据状况,都要经理 N 2 N^2 N2次比较。冒泡排序大量浪费比较行为,每趟比较只会选择出一个最大值,所以性能较差。

选择排序

选择排序是一种简单直观的基于比较的排序算法,性能不受数据状况的左右,就算是已经有序的数据,也是 O ( N 2 ) O(N^2) O(N2)的时间复杂度。

算法步骤

在这里插入图片描述
(不用交换的没有画出)

  • 0 ~ n - 1 范围 找到最小值 交换到 0 位置
  • 1 ~ n - 1 范围 找到最小值 交换到 1 位置
  • 2 ~ n - 1 范围 找到最小值 交换到 2 位置
  • … …
  • n - 2 ~ n - 1 范围找到较小值 交换到 n - 2 位置
  • 排序完成

动图

请添加图片描述

代码

package package01;import java.util.Arrays;public class P01_SelectSort {public static void selectSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {minIndex = arr[minIndex] < arr[j] ? minIndex : j;}swap(arr, minIndex, i);}}public static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}public static void main(String[] args) {int[] arr = {9,8,7,6,5,4,3,2,1};selectSort(arr);System.out.println(Arrays.toString(arr));}
}

总结

选择排序也是一种性能较差的排序算法,性能不受数据状况左右,大量浪费比较行为。

插入排序

在这里插入图片描述

插入排序就像打扑克时拿牌一样,一张一张将扑克牌放到对应的位置,也是一个基于比较的排序。只是插入排序受数据状况影响,当数据状况趋于有序时,插入排序的速度会非常快,趋于 O ( N ) O(N) O(N),但是时间复杂度是最坏情况,所以插入排序的时间复杂度是 O ( N 2 ) O(N^2) O(N2).

算法步骤

在这里插入图片描述
就如上述数据,我们要将这组数字从小到大进行排列。从左往右依次考虑每个数字,让这个数字左边局部有序,考虑完整个数据就有序了。

  • 考虑前 1 1 1 个数 已经有序
  • 考虑前 2 2 2 个数,如果前面的数据大于当前数则交换,做到局部有序
  • 考虑前 3 3 3 个数,如果前面的数据大于当前数则交换,做到局部有序
  • … …
  • 考虑前 n − 1 n - 1 n1 个数,如果前面的数据大于当前数则交换,做到局部有序
  • 完成排序

动图

请添加图片描述

代码

package package01;import java.util.Arrays;public class P03_InsertSort {public static void insertSort(int[] arr) {if(arr == null || arr.length < 2) {return;}for(int i = 1;i < arr.length;i++) {for(int j = i - 1;j >= 0 && arr[j] > arr[j + 1];j--) {swap(arr,j,j+1);}}}public static void swap(int[] arr,int i,int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}public static void main(String[] args) {int[] arr = {0,9,8,7,6,5,4,3,2,1};insertSort(arr);System.out.println(Arrays.toString(arr));}
}

总结

插入排序的常数时间要优于选择排序和插入排序,但是其时间复杂度仍然是 O ( N 2 ) O(N^2) ON2

如果本篇文章对你有帮助,请点赞、评论、转发,你的支持是我创作的动力。

相关文章:

三大基础排序 -选择排序、冒泡排序、插入排序

排序算法 文章目录 冒泡排序算法步骤动图代码优化总结 选择排序算法步骤动图代码总结 插入排序算法步骤动图代码总结 排序算法&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。一般默认排序是按照由小到大即…...

el-form添加自定义校验规则校验el-input只能输入数字

0 效果 1 代码 {1,5}是用来限制小数点后几位的 addFormRules: {investAmount: [{ validator: checkInvestAmount, trigger: blur }], }, const checkInvestAmount (rule, value, callback) > {if (value ! && value ! null && value ! undefined) {if (/…...

ios 开发问题小集 [持续更新]

文章目录 一、如何给列表上的UITableViewCell添加手势二、获取NSIndexPath的方式2.1 根据row, section 来创建2.2 根据point 的位置来找到 indexPath三、tableView在Grouped样式下,设置表头表尾空白一、如何给列表上的UITableViewCell添加手势 给cell添加手势,大家都会这么做…...

idea Plugins 搜索不到插件

Settings — System Settings — HTTP Proxy&#xff0c;打开HTTP Proxy 页面&#xff0c;设置自动发现代理&#xff1a; 勾选Atuto-detect proxy settings&#xff0c;勾选Automatic proxy configuration URL&#xff0c;输入&#xff1a; https://plugins.jetbrains.com/id…...

三相电机的某些实测特性曲线

三相电机参数&#xff1a; 0.75KW&#xff0c;额定电流是2A&#xff0c;功率因数0.71&#xff0c;效率78.9%。制式S1. 1.负载不变时的线电压与线电流的关系 1.1相关数据与python代码&#xff1a; 这里记录了一系列的实验&#xff1a; 第一组实验&#xff1a;近乎空载&#xf…...

Essential C++ 面向对象4.1 ~ 5.4

个人认为&#xff0c;结合网上对《Essential c》的评论&#xff0c;它不适合初学者&#xff1a; &#xff08;1&#xff09;过于精炼&#xff0c;很多内容不会细讲 &#xff08;2&#xff09;中文版翻译较生硬&#xff0c;逻辑不够连贯清晰 &#xff08;3&#xff09;课后作业有…...

数组【数据结构与算法】

什么是线性表&#xff1f;什么是非线性表&#xff1f;什么是数组&#xff1f;数组如何实现根据下标随机访问数组元素&#xff1f;为什么数组从下标0开始&#xff0c;不从下标1开始&#xff1f; 什么是线性表&#xff1f; 数据结构元素只有前后关系。 线性表包括&#xff1a;数…...

Python克隆单个网页

网上所有代码都无法完全克隆单个网页&#xff0c;不是Css&#xff0c;Js下载不下来就是下载下来也不能正常显示&#xff0c;只能自己写了&#xff0c;记得点赞~ 效果如图&#xff1a; 源码与所需的依赖&#xff1a; pip install requests pip install requests beautifulsoup4…...

电脑硬盘数据恢复哪个好?值得考虑的 8 个硬盘恢复软件解决方案

借助硬盘恢复软件&#xff0c;任何人都可以在家中恢复丢失的文件&#xff0c;而无需任何特殊技能。事实上&#xff0c;最困难的一步是选择最佳解决方案&#xff0c;因为可用选项的数量可能有点多。幸运的是&#xff0c;这篇文章可以为您提供帮助。 8 款顶级硬盘数据恢复软件解决…...

第二十三节——路由守卫

一、概念 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中&#xff1a;全局的, 单个路由独享的, 或者组件级的。简单理解&#xff1a;导航守卫就是路由跳转过程中的一些钩子函数&#xff0c;再直白点路由跳转是一个大的过程&#xff0c;这…...

在gitlab中的使用kaniko打造流水线

文章目录 kaniko工具介绍环境说明系统版本组件版本组件部署参考链接 部署harbor下载解压、创建相关目录配置部署 gitlab集成harbor集成项目ci配置最终结果 kaniko工具介绍 kaniko 是一种从容器或 Kubernetes 集群内的 Dockerfile 构建容器镜像的工具。 kaniko 解决了使用 Doc…...

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

19、Flink 的Table API 和 SQL 中的自定义函数及示例(2)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

(动手学习深度学习)第7章 残差网络---ResNet

目录 ResNet总结 ResNet代码实现ResNet的梯度计算 ResNet 总结 残差块使得很深的网络更加容易训练 甚至可以训练一千层的网络 残差网络对随后的深层神经网络设计产生了深远影响&#xff0c;无论是卷积类网络还是全连接类网络。 ResNet代码实现 导入相关库 import torch fro…...

4.Pod详解

4.Pod详解 文章目录 4.Pod详解4.1 Pod介绍4.1.1 Pod结构4.1.2 Pod定义4.1.3 在kubernetes中基本所有资源的一级属性都是一样的&#xff0c;主要包含5部分&#xff1a;4.1.4 在上面的属性中&#xff0c;spec是接下来研究的重点&#xff0c;继续看下它的常见子属性: 4.2 Pod配置4…...

OCR技术狂潮:揭秘最新发展现状,引爆未来智能时代

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术自20世纪以来经历了长足的发展&#xff0c;随着计算机视觉、人工智能和深度学习等领域的进步&#xff0c;OCR技术在准确性、速度和适用范围上都取得了显著的进展。以下是OCR技术发展的现…...

【hcie-cloud】【3】华为云Stack规划设计之华为云Stack交付综述【上】

文章目录 前言华为云Stack交付综述交付流程华为云Stack交付流程华为云Stack安装部署流程 交付工具链华为云Stack交付工具链eDesigner - 让解决方案销售更智能eDesigner配置页面 - 基本信息eDesigner配置页面 - 服务及组网配置eDesigner配置页面 - 弹性云服务器/ECSeDesigner配置…...

Spring Ioc 容器启动流程

Spring容器的启动流程 本文基于 Spring 5.3.23 基于XML文件 public void test() {ApplicationContext applicationContext new ClassPathXmlApplicationContext("applicationContext.xml");User user applicationContext.getBean("user", User.class)…...

【714. 买卖股票的最佳时机含手续费】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:int maxProfit(vector<int>& prices, int fee) {int nprices.size();vector<vector<int>> dp(n,vector<int>(2));dp[0][0]-prices[0…...

JS前端实现身份证号码合法性校验(校验码校验)

在做项目过程中针对自然人数据提交到后端前一般是要进行身份证的合法性校验&#xff0c;当身份证号输入错误以便给于用户友好的提示(也可以根据身份证号同时校验表单中性别和出生日期等)&#xff0c;验证主要是防止无效数据入库。本文在前端使用JavaScript实现15/18位身份证的合…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...