java数据机构.冒泡排序,选择排序 插入排序 递归算法,递归求阶乘,快速排序

news2024/11/13 9:39:02

排序算法

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 递归算法
    • 递归求1~100的和
    • 递归求阶乘
  • 快速排序
  • 总结

冒泡排序

相邻两个元素比较,大的放右边,小的放左边
第一轮循环结束最大值已经找到,在数组最右边(归为算法)
第二轮在剩余的元素比较找到次大值,第二轮可以少循环一次
如果有n个数据,总共我们只要执行n-1论代码就可以了

   public static void main(String[] args) {
        //冒泡排序'


        int arr[]={2,4,5,3,1};


        //利用冒泡索引将他变成12345
        //第一轮结束后最大值在最右边

        for (int i = 0; i < arr.length-1-0; i++) {//这里是length-1的原因是因为比较第四个元素的时候 4跟5比较  5最后一个就不需要比较了


            if(arr[i]>arr[i+1]){

                int temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;

            }

        }

        //遍历数组
        for (int i = 0; i < arr.length; i++) {
           // System.out.print(arr[i]+ " ");//2 4 3 1 5
        }



        //第二轮

        for (int i = 0; i < arr.length-1-1; i++) {//这里是length-1的原因是因为比较第四个元素的时候 4跟5比较  5最后一个就不需要比较了


            if(arr[i]>arr[i+1]){

                int temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;

            }

        }

        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+ " ");//2 3 1 4 5
        }

        //第三轮....
        //第四...

    }

以上代码比较冗余
改进思路:采用嵌套循环的思路.外循环表示要执行的轮数也就是length-1
{2,4,5,3,1}比如这个要执行的轮数是0 1 2 3 . 4轮即可
内循环是每轮内执行的代码根据以上代码得出是length-1-i. i是0 1 2 3 4依次
内循环第一次0索引执行每次的比较交换代码得到2 4 3 1 5
内循环

    public static void main(String[] args) {
        //冒泡排序'


        int arr[]={2,1,5,4,3};


        //利用冒泡索引将他变成12345
        //第一轮结束后最大值在最右边

        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {//这里是length-1的原因是因为比较第四个元素的时候 4跟5比较  5最后一个就不需要比较了

                //内循环:每一轮如何比较数据并找到最大值
                //-1是防止月结
                //-i是提高效率 每一轮执行的次数应该比上一轮少一次


                if(arr[j]>arr[j+1]){

                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;

                }

            }

        }
        printarr(arr);


    }

选择排序

核心思想 一轮比较确定一个最小的数据(归为),他就排在第一个
第二轮就直接从1索引开始找第二小的
拿着索引1的跟后面所有的比较一遍 遇见小的就交换

    public static void main(String[] args) {

        //选择排序
        int arr[]={2,4,5,3,1};

        //第一轮

        //int i = 0-1因为自己没有必要跟自己比较
        for (int i = 0+1; i < arr.length; i++) {
            if (arr[0]>arr[i]){
                int temp=arr[0];
                arr[0]=arr[i];
                arr[i]=temp;
            }


        }
        //printarr(arr);//1 4 5 3 2


        //第二轮

        //int i = 0-1因为自己没有必要跟自己比较
        for (int i = 0+2; i < arr.length; i++) {
            if (arr[1]>arr[i]){
                int temp=arr[1];
                arr[1]=arr[i];
                arr[i]=temp;
            }


        }
        //printarr(arr);//1 2 5 4 3



        //第三轮

        //int i = 0-1因为自己没有必要跟自己比较
        for (int i = 0+3; i < arr.length; i++) {
            if (arr[2]>arr[i]){
                int temp=arr[2];
                arr[2]=arr[i];
                arr[i]=temp;
            }


        }
        printarr(arr);//1 2 3 5 4 


    }

以下改进

    public static void main(String[] args) {

        //选择排序
        int arr[]={2,4,5,3,1};

      //外循环 表示我拿着哪个索引上的值跟后面的比较
        //length-1是因为最后一个索引不需要跟自己比较
        for (int i = 0; i < arr.length-1; i++) {

            for (int j =i+1 ; j < arr.length; j++) {
                //内循环是每一轮我要做什么事情
                //内循环表示拿着i跟i后面的数据交换 .j相当于i后面的数据
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        printarr(arr);
    }

插入排序

插入排序思想:将前面的索引看成有序的(前面的几个取决于有序的有几个),后买你的看成无序的. 然后遍历无序,将遍历的到的元素插入有序序列中.如遇到相同数据,插在后面

 public static void main(String[] args) {
        int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};


        //找到无序数组从哪里开始
        int startIndex=-1;
        //用-1是因为-1是无效的相当于定义为0;

        for (int i = 0; i < arr.length; i++) {

            if(arr[i]>arr[i+1]){//这个相当于找到了前面有序的索引

                startIndex=i+1;//这个i相当于有序序列的最后一个索引 加一是无序序列的起始索引

                break;



            }




        }
        for (int i = startIndex; i < arr.length; i++) {//相当于遍历无序索引

            //遍历无序  得到元素与有序交换

            int j=i;//记录要插入数据的索引
            while(j>0&&arr[j]<arr[j-1]){//j当前元素.j-1前一个元素.  arr[j]可以理解为38 j-1就是44.然后交换 交换完后j--  j还是38  然后38和3判断

                int temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;

                j--;//表示我是与前面的数据判断的

            }




        }
        printarr(arr);//2 3 4 5 15 19 26 27 36 38 44 46 47 48 50 



    }

递归算法

就是方法自己调用自己

在这里插入图片描述

递归要写出口(就是调用自己到什么时候不调用自己了)否则就会跟上面一样导致栈溢出

递归求1~100的和

   public static void main(String[] args) {


        //求1到100的和 用递归思想

        //大问题拆成小问题
        //1~100之间的和=100+(1~99之间的和)
        //1~99之间的和=99+(1~98之间的和)
        //..
        //1~2之间的和=2+(1~1之间的和)
        //1~1之间的和=1;这个就是出口



        //找出口


        System.out.println(getSum(100));//5050

    }

    private static int getSum(int number) {
        if(number==1){
            return 1;
        }//出口


        return number+getSum(number-1);



    }

}

递归求阶乘

public class jiecheng {
    public static void main(String[] args) {
        //5的阶乘就是5!   5×4×3×2×1



        //找借口
        //找规律

        //大问题化小问题
        //5!  就是5×4!
        //4!  就是4×3!
        //...
        //1! 就是1(出口)

        System.out.println(getNumber(5));

    }

    private static int getNumber(int number) {
        if(number==1){
            return 1;
        }

        return number*getNumber(number-1);

    }
}

原理内存图
在这里插入图片描述

快速排序

在这里插入图片描述

在这里插入图片描述

  //快速排序的思想是:拿到一组数据  第一个作为基准数.
    //从头开始往后找找出比基准数大的.从尾部开始往前找  找比基准数小的
    //找到了直接交换数据 找不到继续往前找start++  end--.

    public static void main(String[] args) {
        int arr[]={6,1,2,7,9,3,4,5,10,8};

//第一一个方法 传入数组 头部和尾部

        quicksort(arr,0,arr.length-1);

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

    private static void quicksort(int arr[], int i, int j){

        int start=i;
        int end=j;
        if(start>end){//起始索引跑到结束索引后面了
            return;//这是递归出口
        }

        //传入基准数
        int basicNumber=arr[i];


        //利用循环找到要交换的数字
        while(start!=end){
            //利用end从后往前找 找到比基准数小的
            while(true){
                if(end<=start||arr[end]<basicNumber){
                    break;
                }

                end--;
            }

            //利用start从前往后找 找到比基准数da的
            while(true){
                if(end<=start||arr[start]>basicNumber){
                    break;
                }

                start++;

            }

            //把start和end指向的元素进行交换
            int temp=arr[start];
            arr[start]=arr[end];
            arr[end]=temp;
        }
        //把基准数跟start或者end交换

        int temp=arr[i];
        arr[i]=arr[start];
        arr[start]=temp;


        //3 1 2 5 4 6 9 7 10 8
        //这是第一轮结束后的结果

        //后面的直接用递归调用
        //这里的i相当于起始索引
        //start-1相当于 6前面的.  因为前面start跟i进行了交换
        quicksort(arr,i,start-1);//这是6左边
        quicksort(arr,start+1,j);//这是6的右边start+1相当于9

    }

总结

在这里插入图片描述

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

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

相关文章

第18期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

微信小程序怎么制作?【小程序开发平台教学】

随着移动互联网的快速发展&#xff0c;微信小程序已经成为了人们日常生活中不可或缺的一部分。从购物、支付、出行到社交、娱乐、教育&#xff0c;小程序几乎涵盖了我们生活的方方面面。那么&#xff0c;对于有营销需求的企业商家来说&#xff0c;如何制作一个自己的微信小程序…

wow这么洋气的羽绒服,看起来太暖和了吧

超足充绒量&#xff0b;杜邦三防工艺 高立领连帽设计&#xff0b;腰部抽绳调节 独特压线设计&#xff0b;实用大口袋 洋气又实用的一款羽绒服&#xff01;&#xff01;

【机器学习合集】模型设计之残差网络 ->(个人学习记录笔记)

文章目录 模型设计之残差网络1. 什么是残差结构1.1 网络加深遇到的优化问题1.2 short connect技术 2. 残差网络及有效性理解2.1 残差网络 3. 残差网络的发展3.1 密集残差网络3.2 更宽的残差网络(wide resnet)3.3 分组残差网络3.4 Dual Path Network3.5 加权残差网络3.6 预激活残…

Java逻辑程序控制与方法

&#x1f435;本篇文章将对Java的分支结构、循环结构以及方法的部分知识点进行讲解 Java的分支结构、循环结构和C语言基本一致&#xff0c;这里只做简单介绍 1. 分支结构↔️ 1.1 if语句 if (布尔表达式) { ... } else if (布尔表达式) { ... } else { ... } if () {if () {.…

文件同步软件选择准则

随着科技的飞速发展&#xff0c;文件同步软件已成为我们日常工作中不可或缺的一部分。它可以帮助我们轻松地实现文件在不同设备、不同服务器之间的同步&#xff0c;确保数据的安全性和一致性。然而&#xff0c;市场上的文件同步软件种类繁多&#xff0c;如何选择适合自己的软件…

管网智慧化建设能为管网提供哪些优势?第3点特别值得注意!

关键词&#xff1a;智能管网、智慧管网、智慧管网建设、智慧燃气、气管网压力监测解决方案 随着信息技术的不断发展&#xff0c;数字城市的发展正在快速向智慧城市推进&#xff0c;而管网智慧化建设是目前智慧城市建设中不可或缺的一个重要举措。 因为早期铺设使用的排水管道…

[NISACTF 2022]join-us 无列名注入 过滤database() 报错获取表名 字段名

mysql注入可报错时爆表名、字段名、库名 – Wupcos Blog 又是sql注入 来做一些吧 这里我们可以很快就获取注入点 抓包开干 开fuzz 过滤很多东西哦 database都过滤了 那么要咋弄啊。。。 绕过database() 这里其实我们可以通过报错来实现 1|a()%23 数据库名这不就来了 然后…

一条 SQL 是如何在 MyBatis 中执行的

前言 MyBatis 执行 SQL 的核心接口为 SqlSession 接口&#xff0c;该接口提供了一些 CURD 及控制事务的方法&#xff0c;另外还可以通过 SqlSession 先获取 Mapper 接口的实例&#xff0c;然后通过 Mapper 接口执行 SQL&#xff0c;Mapper 接口方法的执行最终还是委托到 SqlSe…

循环神经网络 - RNN

循环神经网络&#xff08;Rerrent Neural Network,RNN&#xff09;是神经网络的一种&#xff0c;类似的还有深度神经网络&#xff08;DNN&#xff09;、卷积神经网路(CNN)、生成对抗网络&#xff08;GAN)等。**RNN对具有时序特性的数据非常有成效&#xff0c;他能挖掘数据中的时…

初识webpack和打包过程

文章目录 一、path模块1.内置模块path2.path常见的API 二、webpack1.认识webpack2.脚手架依赖于webpack3.Webpack到底是什么呢&#xff1f;4.Vue项目加载的文件有哪些呢&#xff1f;5.Webpack的使用前提6.Webpack的安装7.Webpack的默认打包8.创建局部的webpack 三、webpack配置…

第19章_写在最后

第19章_写在最后 分享1 分享2 如何看待生活上、工作上的冗余、反冗余&#xff1f; 又如何看待社会的脆弱性&#xff1f;反脆弱性&#xff1f; 个人如何应对&#xff1f;

基于深度学习的人脸性别年龄识别 - 图像识别 opencv 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

血的教训-踩了定时线程池的坑

ScheduledExecutorService 一、背景 大家好呀&#xff0c;上周我们公司由于定时线程池使用不当出了一个故障&#xff0c;几千万的单子可能没了 给兄弟们分享分享这个坑&#xff0c;希望兄弟们以后别踩&#xff01; 业务中大量的使用定时线程池&#xff08;ScheduledExecuto…

CSS3盒模型

CSS3盒模型规定了网页元素的显示方式&#xff0c;包括大小、边框、边界和补白等概念。2015年4月&#xff0c;W3C的CSS工作组发布了CSS3基本用户接口模块&#xff0c;该模块负责控制与用户接口界面相关效果的呈现方式。 1、盒模型基础 在网页设计中&#xff0c;经常会听到内容…

软件测试面试,一定要提前准备好的面试题

收集了2023年所有粉丝的面试题后&#xff0c;负责整理出了7个高频出现的面试题&#xff0c;一起来看看。 问题1&#xff1a;请自我介绍下&#xff1f; 核心要素&#xff1a;个人技能优势工作背景经验亮点 参考回答&#xff1a; 第一种&#xff1a;基本信息离职理由 面试官您好&…

吐血整理,Jmeter接口测试-项目案例场景,直接上高速...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 场景一&#xff1…

人工智能-softmax回归

回归可以用于预测多少的问题。 比如预测房屋被售出价格&#xff0c;或者棒球队可能获得的胜场数&#xff0c;又或者患者住院的天数。 事实上&#xff0c;我们也对分类问题感兴趣&#xff1a;不是问“多少”&#xff0c;而是问“哪一个”&#xff1a; 某个电子邮件是否属于垃圾…

groovy下载与安装

Groovy是一种基于JVM&#xff08;Java虚拟机&#xff09;的敏捷开发语言&#xff0c;它结合了Python、Ruby和Smalltalk的许多强大的特性&#xff0c;Groovy 代码能够与 Java 代码很好地结合&#xff0c;也能用于扩展现有代码。由于其运行在 JVM 上的特性&#xff0c;Groovy也可…

ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑

ElasticSearch深度解析入门篇&#xff1a;高效搜索解决方案的介绍与实战案例讲解&#xff0c;带你避坑 1.Elasticsearch 产生背景 大规模数据如何检索 如&#xff1a;当系统数据量上了 10 亿、100 亿条的时候&#xff0c;我们在做系统架构的时候通常会从以下角度去考虑问题&a…