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

排序算法

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 递归算法
    • 递归求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.hqwc.cn/news/158552.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数智赋能!麒麟信安参展全球智慧城市大会

10月31日至11月2日&#xff0c;为期三天的2023全球智慧城市大会长沙在湖南国际会展中心举办&#xff0c;大会已连续举办12届&#xff0c;是目前全球规模最大、专注于城市和社会智慧化发展及转型的主题展会。长沙市委常委、常务副市长彭华松宣布开幕&#xff0c;全球智慧城市大会…

Servlet 初始化参数(web.xml和@WebServlet)

1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…

计算机由于找不到msvcr120.dll无法执行代码的解决方法分享(亲测有效)

在使用软件过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcr120.dll无法继续执行代码”。这个问题通常是由于缺少Microsoft Visual C Redistributable Packages for Visual Studio 2013&#xff08;简称MSVCRT&#xff09;导致的。MSVCRT是…

AI集成ChatGPT敲代码神器Copilot

&#x1f4d1;前言 本文主要是AI工具Copilot解读文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

Gopro hero5运动相机格式化后恢复案例

Gopro运动相机以稳定著称&#xff0c;旗下的Hero系列销售全球。下面我们来看一个Hero5格式化后拍了少量素材的恢复案例。 故障存储:64G MicroSD卡 Exfat文件系统 故障现象: 64G的卡没备份数据时做了格式化操作又拍了一条&#xff0c;发现数据没有备份&#xff0c;客户自行使…

【Redis】高并发分布式结构服务器

文章目录 服务端高并发分布式结构名词基本概念评价指标1.单机架构缺点 2.应用数据分离架构应用服务集群架构读写分离/主从分离架构引入缓存-冷热分离架构分库分表&#xff08;垂直分库&#xff09;业务拆分⸺微服务 总结 服务端高并发分布式结构 名词基本概念 应⽤&#xff0…

Vue组件化开发,组件的创建,注册,使用,详解Vue,vm,VueComponent,vc

组件化开发 模块是指将一个大的js文件按照模块化拆分规则进行拆分成的每个js文件, 凡是采用模块方式开发的应用都可以称为模块化应用(组件包括模块) 传统方式开发的一个网页通常包括三部分: 结构(HTML)、样式(CSS)、交互(JavaScript) 关系纵横交织复杂&#xff0c;牵一发动全…

ArcGIS Pro怎么生成高程点

一般情况下&#xff0c;我们从公开渠道获取到的高程数据都是DEM数据&#xff0c;但是如果要用到CAD等软件内则需要用到高程点&#xff0c;那么如何从DEM提取高程点呢&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是…

Git Rebase 优化项目历史

在软件开发过程中&#xff0c;版本控制是必不可少的一环。Git作为当前最流行的版本控制系统&#xff0c;为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性&#xff0c;它可以用来重新整理提交历史&#xff0c;使之更加清晰和线性。本文将详细介绍g…

将一个Series序列转化为数据框Dataframe格式Series.to_frame()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将一个Series序列 转化为Dataframe格式 Series.to_frame() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd s pd.Series([1,2],name"myValue") print("【显…

【Unity实战】最全面的库存系统(一)

文章目录 先来看看最终效果前言定义物品定义人物背包物品插槽数据拾取物品物品堆叠绘制UI移动拖拽物品选中物品跟随鼠标移动背包物品交换物品拆分物品物品堆叠完结先来看看最终效果 前言 它又来了,库存系统我前面其实一句做过很多次了,但是这次的与以往的不太一样,这个将是…

【windows】添加共享打印机错误:0x000006ba

【问题描述】 添加共享打印机的时候&#xff0c;提示操作无法完成。 错误&#xff1a;0x000006ba。 【解决方法】 一、看下服务里 打印机服务Print Spooler是否正常启动&#xff1b; 二、打印机服务Print Spooler没有的话&#xff1b;&#xff08;开始–运行—services.msc 回…