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

排序算法

文章目录

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

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

冒泡排序

冒泡排序(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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下MSYS2下载与安装

下载地址&#xff1a; 官网下载地址 https://www.msys2.org/阿里云镜像下载 https://mirrors.aliyun.com/msys2/distrib/x86_64/https://mirrors.aliyun.com/msys2/distrib/x86_64/msys2-x86_64-20231026.exe?spma2c6h.25603864.0.0.12b92551XW5OSM官网下载 ![官网下载](htt…

uniapp u-tabs表单如何默认选中

首先先了解该组件&#xff1b;该组件&#xff0c;是一个tabs标签组件&#xff0c;在标签多的时候&#xff0c;可以配置为左右滑动&#xff0c;标签少的时候&#xff0c;可以禁止滑动。 该组件的一个特点是配置为滚动模式时&#xff0c;激活的tab会自动移动到组件的中间位置。 …

算法竞赛——数论(一),数论内容的介绍,基础数论

文章目录 一&#xff0c; 数论学习路线的介绍和相关建议1&#xff0c;建议学习人群 &#xff1a;2&#xff0c;建议学习时长3&#xff0c;学习路线的介绍1&#xff0c;基础数论2&#xff0c;组合数学3&#xff0c;计算几何 二&#xff0c;基础数论第一部分 —— 快速幂和快速幂…

Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等

Java算法&#xff08;三&#xff09; 需求&#xff1a; 1. 定义一个方法&#xff0c;用于比较两个数组是否相同2. 需求&#xff1a;长度&#xff0c;内容&#xff0c;顺序完全相同package com.liujintao.compare;public class SameArray {public static void main (String[] a…

一篇文章让你Docker从入门到精通

一篇文章让你Docker从入门到精通 Docker简介docker的3要素docker安装--centos7示例docker底层原理docker常用命令docker镜像原理数据共享--容器数据卷数据卷容器dockerfile解析Dockerfile实战一 使用dockerfile构建ubuntu镜像&#xff0c;并在里面安装vim及网络工具 一张图展示…

论文阅读:Ensemble Knowledge Transfer for Semantic Segmentation

论文地址&#xff1a;https://ieeexplore.ieee.org/document/8354272 项目及数据地址&#xff1a;https://github.com/ishann/aeroscapes 发表时间&#xff1a;2018年5月7日 语义分割网络通常以严格监督的方式学习&#xff0c;即它们在相似的数据分布上进行训练和测试。在域转…

EPLAN软件中的术语-主数据‘’技术分享

在EPLAN中&#xff0c;主数据(Master Data)这个词被经常、反复地提及&#xff0c;我曾经困惑了很长时间&#xff0c;不得要领。在EPLAN的帮助系统中&#xff0c;它列举了一部分内容&#xff0c;说这些这些就是主数据&#xff0c;但没有解释什么是主数据&#xff0c;除了上面这些…

怎么压缩jpg大小?快来收藏这款jpg压缩工具

不管是工作还是日常生活中&#xff0c;都免不了要用到许多图片&#xff0c;其中jpg图片格式是最常见的一种格式&#xff0c;那么小伙伴们知道怎么将jpg格式压缩大小吗&#xff1f;jpg压缩不仅可以为我们的设备节省空间&#xff0c;还能避免许多对图片大小有限制的平台&#xff…

阿里云双11优惠活动:2核2G3M云服务器1年99元,新老用户均可购买!

阿里云双11优惠活动正在火热进行中&#xff0c;阿里云推出了一款特价云服务器ECS&#xff0c;2核2G3M的配置1年仅需99元&#xff0c;新老用户均可购买&#xff0c;新购、续费同价&#xff01; 活动入口&#xff1a;传送门>>> 活动详情&#xff1a; 云服务器ECS&#…

2023年云计算的发展趋势如何?

混合云的持续发展&#xff1a;混合云指的是将公有云和私有云进行结合&#xff0c;形成一种统一的云计算环境。随着企业对数据隐私和安全性的要求越来越高&#xff0c;以及在数据存储和处理方面的需求不断增长&#xff0c;混合云正在逐渐成为主流。预计未来混合云将会继续保持高…

经典矩阵试题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、回型矩阵1、题目介绍2、思路讲解3、代码实现4、结果 二、蛇型矩阵1、题目介绍2、思路讲解…

[vue-router]vue3.x Hash路由前缀问题

[vue-router]vue3.x Hash路由前缀问题 问题描述问题分析 问题描述 是在本地开发时&#xff0c;使用的HASH路由&#xff0c;然后在偶然的情况下在/#/前添加了前缀&#xff0c;发现不影响本地的路由的使用&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01;&#xf…

chatGPT培训老师AIGC培训讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-6

以下为叶老师讲义分享&#xff1a; P25-P29 提示工程的模式 节省计算资源&#xff1a; 在微调过程中&#xff0c;不需要重新训练整个模型&#xff0c;因此可以节省计算资源。 提高特定任务上的性能&#xff1a; 通过微调&#xff0c;模型可以适应特定任务的语言特征和模式…

怎样在iOS手机上进行自动化测试

Airtest支持iOS自动化测试&#xff0c;在Mac上为iOS手机部署iOS-Tagent之后&#xff0c;就可以使用AirtestIDE连接设备&#xff0c;像连接安卓设备一样&#xff0c;实时投影、控制手机。iOS测试不仅限于真机测试&#xff0c;iOS模拟器也可以进行。Mac端上部署完成后还可以提供给…

linux继续循环案例测试ping网络,目录下的文件权限循环输出

第一&#xff1a;查看本机ip #ip addr 通过脚本访问本机ip1-100&#xff0c;是否可以ping通&#xff0c;并显示结果&#xff0c;上图 知识点 ping -c 数字1 -w 数字1&#xff0c;向目的ip发送1个数据包&#xff0c;等待1秒&#xff0c;无回复中止 &>/dev/null 知…

中远麒麟堡垒机SQL注入漏洞复现

简介 中远麒麟堡垒机用于运维管理的认证、授权、审计等监控管理&#xff0c;在该产品admin.php处存在SQL 注入漏洞。 漏洞复现 FOFA语法&#xff1a; body"url\"admin.php?controlleradmin_index&actionget_user_login_fristauth&username" 或者 c…

Python 爬虫基础

Python 爬虫基础 1.1 理论 在浏览器通过网页拼接【/robots.txt】来了解可爬取的网页路径范围 例如访问&#xff1a; https://www.csdn.net/robots.txt User-agent: * Disallow: /scripts Disallow: /public Disallow: /css/ Disallow: /images/ Disallow: /content/ Disallo…

接口测试总结

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

[Day1]工业网络智能控制:三层交换机与防火墙

基础知识点 什么是内网? 内网就是我们平常说的局域网。局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组。它可以是邻居之间的2台电脑&#xff0c;也可以是一幢100层大楼里的1000台电脑。局域网可以是独立封闭运行的&…

开发知识点-stm32/ESP32/Mega2560嵌入式设计

嵌入式设计 STM32四轴飞行器原理图解析小马哥 DragonFly四轴软件开发 13 STM32 SPI总线通讯SPI 总线协议简介SPI 物理层SPI 协议层SPI 通信时序 STM32硬件SPI接口简介SPI接口 利用库函数初始化配置 ESP32 “F:\res\marlin-2.0.x” “F:\res\Marlin-2.1.2” STM32四轴飞行器 小…