排序算法——选择排序、冒泡排序、插入排序 超易理解【JAVA】

news2024/11/18 14:24:02

一、什么是选择排序算法?

选择排序(Selection sort)是一种简单直观的排序算法。 选择排序是不稳定的排序方法。时间复杂度O(n2)

工作原理
  • 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
  • 然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
  • 以此类推,直到全部待排序的数据元素的个数为零。
图解

在这里插入图片描述


coding
public class 选择排序 {


    /**
     * 选择排序
     * @param arr
     */
    public static void selectSort(int[] arr){
        //1.先想边界条件 --->arr为空或者小于两个元素,则不用排序
        if (arr== null || arr.length<2) {
            return;
        }
        int N = arr.length;
        for (int i=0;i<N;i++) {
            //0 ~ n-1
            //1 ~ n-1
            //2 ~ n-1
            //i ~ n-1
            int minValueIndex = i;  //经过排序后,i的位置就是本轮排序最小值的位置
            for (int j=i+1;j<N;j++) {
                minValueIndex = arr[j]<arr[minValueIndex] ? j : minValueIndex;
            }
            swap(arr,i,minValueIndex);
        }
    }
    /**
     * 位置交换
     */
    public static void swap(int[] arr,int i,int j) {
        int tmp = arr[j];
        arr[j] = arr[i];
        arr[i] = tmp;
    }

    /**
     * 打印数组
     * @param arr
     */
    public static void printArray(int[] arr) {
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }


    public static void main(String[] args) {

        int[] arr = {7,1,3,5,1,6,8,1,3,5,7,5,6};
        printArray(arr);
        selectSort(arr);
        printArray(arr);
    }
}

二、什么是冒泡排序算法?

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。冒泡排序是稳定的排序方法

  • 它重复地走访过要排序的数列,每次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。
  • 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
时间复杂度

最好情况:数据本身是有序的,那么冒泡排序只需与一次循环遍历即可,因此时间复杂度是O (n)。 最坏情况: 数据本身都是倒序的,那么需要循环遍历n次,因此时间复杂度是O (n^2)。

工作原理

请添加图片描述


coding
public class 冒泡排序  {


    public static void main(String[] args) {

        int[] arr = {7,1,3,5,1,6,8,1,3,5,7,5,6};
        printArray(arr);
        bubbleSort(arr);
        printArray(arr);
    }

    private static void bubbleSort(int[] arr) {
        if (arr==null || arr.length<2) {
            return;
        }
        for (int i=0;i<arr.length-1;i++) {
            // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
            boolean flag = true;
            for (int j=0;j<arr.length-i-1;j++){
                int mid =0;
                if (arr[j]>arr[j+1]) {
                    mid=arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = mid;

                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }

    private static void printArray(int[] arr) {
        for (int i : arr) {
            System.out.print(i);
        }
        System.out.println();
    }
}

三、什么是插入排序算法?

工作原理

插入排序(InsertionSort)是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。 按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序 。
时间复杂度最差为O (n^2)。

图解

请添加图片描述

coding
public class 插入排序 {
    
    public static void main(String[] args) {

        int[] arr = {7,1,3,5,1,6,8,1,3,5,7,5,6};
        printArray(arr);
        insertSort(arr);
        printArray(arr);
    }
    private static void printArray(int[] arr) {
        for (int i : arr) {
            System.out.print(i);
        }
        System.out.println();
    }
    //插入排序方法一
    private static void insertSort(int[] arr) {
        if (arr==null || arr.length<2) {
            return;
        }
        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for (int i=1;i<arr.length;i++) {
            //记录要插入的数据
            int tmp = arr[i];
            //从已经排序的序列最右边的开始比较,找到比其小的数
            int j = i;
            while (j>0 && tmp<arr[j-1]) {
                //把要插入的数列拉出来,把它前面的比它小的数列提前
                arr[j] = arr[j-1];
                j--;
            }
            if (j != i) {
                arr[j] = tmp;
            }
        }
    }
    
	//插入排序方法二
	private static void insertZuoSort(int[] arr) {
        if (arr==null  || arr.length<2) {
            return;
        }
        
        for (int i=1;i<arr.length;i++) {
            int newNumIndex = i;
            while (newNumIndex-1>=0 && arr[newNumIndex]<arr[newNumIndex-1]){
                swap(arr,newNumIndex-1,newNumIndex);
                newNumIndex--;
            }
        }
    }
    //方法三
    private static void insertZuoSort2(int[] arr) {
        if (arr==null  || arr.length<2) {
            return;
        }

        for (int i=1;i<arr.length;i++) {
             //pre 新数的前一个位置
             for (int pre = i-1;pre>=0 && arr[pre]>arr[pre+1];pre--) {
                 swap(arr,pre,pre+1);
             }
        }
    }
    
   private static void swap(int[] arr, int i, int j) {
        int tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis安装(单机模式和哨兵模式)

单机模式&#xff08;学习环境建议&#xff09;&#xff1a; 1.添加软件安装源 yum install epel-release 2.安装redis yum install redis -y 3.启动redis systemctl start redis 4.允许开机启动 systemctl enable redis 5.修改配置 vim /etc/redis.conf 6.bind改成…

我的期末网页设计HTML作品——咖啡文化网页制作

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

[附源码]计算机毕业设计智能家电商城Springboot程序

项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Maven管理等等。 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse…

深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」

Nginx前提回顾 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: Web服务器&#xff1a;相比 Apache&#xff0c;Nginx 使用更少的资源&#xff0c;支持更多的并发连接&#xff0c;体现更高的效率&#xff0c;这点使 Nginx 尤其受到虚拟主机提供商的欢…

python中利用随机数绘制曲线

使用python绘制数学函数图像很方便&#xff0c;在构造函数自变量取值时可以利用随机数生成模块&#xff0c;因本人工作需要&#xff0c;现将python中随机数的使用&#xff0c;以及二次函数图像绘制进行梳理总结 目录 1. python中的随机数产生 1.1 random模块 1.1 numpy.ran…

基于Zephyr平台nRF Connect SDK在Windows10下开发环境的快速搭建

基于Zephyr平台nRF Connect SDK在Windows10下开发环境的快速搭建 前言. Nordic开发SDK需要在线搭建&#xff0c;对于网络不太好的&#xff0c;实在是费时费力&#xff0c;该文特点是利用拷贝已经搭建好的一个SDK目录&#xff0c;直接在新的PC平台实现大部分文件的离线安装&…

职业成功指南:10条核心原则(下)丨三叠云

本期继续讲一下职场。 我将通过这两期的内容&#xff0c;为你提供一套简单的核心原则&#xff0c;希望能在职业道路上帮助到你。 让我们一起走进《职业成功指南&#xff1a;10条核心原则》下期 6. 避免攀比陷阱 在职业生涯的早期&#xff0c;你很容易将自己与周围的人进行比…

《Linux运维总结:Centos7.6部署二进制mongodb4.2.23三节点副本集群》

一、Mongodb集群模式 1、三种集群介绍 MongoDB有三种集群部署模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 1、Master-Slaver 是一种主从副本的模式&#x…

[附源码]计算机毕业设计智慧园区运营管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

详解设计模式:观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;也被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模型-视图&#xff08;Model/View&#xff09;模式&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 观察者模式 定义了一对多的关系&#xff…

牛客网最新Java面试通关八股文手册,花点耐心每天刷上10道题,挑战一下年薪50W!

明年金三银四不少人已经蓄势待发&#xff0c;信心满满地准备投递简历&#xff0c;到处面试&#xff0c;在不同的 Offer 之中择优而栖。 与此同时&#xff0c;也有人会悔恨自己这半年进步不大&#xff0c;每天噼里啪啦敲代码&#xff0c;但面对那些不能再熟悉的 Java 面试题时&…

H2N-Val-Pro-Pro-COOH,58872-39-2

H-Val-Pro-Pro-OH&#xff0c;是牛奶来源的脯氨酸肽衍生物&#xff0c;是血管紧张素 I 转化酶 (ACE) 的抑制剂&#xff0c;其IC50 为 9 μM。H-Val-Pro-Pro-OH, a milk-derived proline peptides derivative, is an inhibitor of Angiotensin I converting enzyme (ACE), with …

C++手敲基于梯度图和像素数量数组的OTSU阈值分割

一、OTSU算法原理 ➢OTSU法&#xff08;最大类间方差法&#xff0c;有时也称之为大津算法&#xff09; ➢ 使用聚类的思想&#xff0c;把图像的灰度数按灰度级分成2个部分&#xff0c; 使得两个部分之间的灰度值差异最大&#xff0c;每个部分之间的灰 度差异最小 ➢ 通过方…

数学建模-2022年亚太赛C题(含思路过程和代码)

目录 一、题目以及大概的思路 二、数据预处理 三、预测模型 四、全球变暖的相关性分析 五、赛后总结 一、题目以及大概的思路 先对数据进行无量纲化处理&#xff0c;根据所给不确定度与数据&#xff0c;计算出相对不确定度&#xff0c;并将其异常点剔除&#xff0c;通常情况…

[附源码]计算机毕业设计病房管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Cisco ASA防火墙——远程控制与多安全区域

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.远程管理ASA 1.配置Telnet接入 2.配置SSH接入 3.配置ASDM接…

Java数据结构与Java算法学习Day02---算法排序

目录 一、简单排序 1.1Comparable接口介绍 11 1.2冒泡排序 12、13、14 1.3选择排序 15、16、17 1.4插入排序 18、19、20 二、高级排序 2.1希尔排序 21、22、23 2.2归并排序 24 2.2.1递归 24 2.2.2归并排序 25 2.3快速排序 32 2.3.1快速排序的原理 32 2.3.2快速排序…

这可能是我见过最可爱的乒乓女孩了!

3D角色艺术家Carlos Sanz曾在U-tab学习动画&#xff0c;在CICE学习角色创作&#xff0c;现在正致力于创作她的作品集并成为3D动画行业的一员&#xff0c;本文是作者在ZBrush和Maya等软件中设计乒乓女孩角色造型的教程&#xff1a; 首先给大家做个自我介绍。我叫Carlos Sanz&am…

[附源码]计算机毕业设计springboot网上电影购票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

(阅读笔记)急性卒中CT灌注分析在临床中的实际问题

&#xff08;阅读笔记&#xff09;急性卒中CT灌注分析在临床中的实际问题IntroductionUnderstanding the basics of CTP acquisition and processingCTP thresholds and quantificationPitfalls of perfusion imagingTechnical pitfallsPatient motionContrast bolusRadiationC…