数组常见算法

一、数组排序

冒泡排序

        本篇我们介绍最基本的排序方法:冒泡排序。

实现步骤

1、比较两个相邻元素,如果第一个比第二个大,就交换位置

2、对每一对相邻元素进行同样的操作,除了最后一个元素

特点

每一轮循环后都会把最大的一个数交换到末尾,因此下一轮就可以忽略最后的数。

总共比较n-1轮,每轮比较n-1-i次

代码实现

//无序数组
int[] number1= {8,9,7,4,3};
//int[] number1= {1,2,3,4,6};//有序数组 比较次数为:4
System.out.println("排序前"+Arrays.toString(number1));
int count=0;
for(int i=0;n=number1.length();i++){boolean isSorted=true;for(int k=0;k<n-1-i;k++){count++;//如果发生元素的交换则代表源数组无序if(number1[k]>number1[k+1]){number1[k]=number1[k]^number1[k+1];number1[k+1]=number1[k]^number1[k+1];    number1[k]=number1[k]^number1[k+1];isSorted=false;}}//若没有发生元素的交换则说明数组已经有序,则跳出循环,但至少比较一次if(isSorted){break;}
}
System.out.println("比较次数为:"+count);
System.out.println("排序后"+Arrays.toString(number1));

输出结果:

排序前[8, 9, 7, 4, 3]
比较次数为:10
排序后[3, 4, 7, 8, 9] 

 使用Arrays工具类排序

        实际上,Java的标准库已经内置了排序功能,我们只需要调用Arrays.sort()方法就可以实现快速排序:

int ns={3,6,1,8,2,9};
//排序前
System.out.println("排序前:"Arrays.toString(ns));
//排序
ns.sort();
//排序后
System.out.println("排序后:"Arrays.toString(ns));

输出结果:

排序前:[3,6,1,8,2,9]

 排序后:[1,2,3,6,8,9]

二、无序数组查找

        在一个无序数组中,如果需要进行指定元素的查找,可以通过循环遍历或Arrays工具类两种方式进行查找。

遍历查找

        我们可以通过对无序数组进行遍历,将数组中的每一个元素与目标元素进行比较,从而确定该数组中是否包含该目标数组:

整型数组

int[] array= {2,3,1,56,72,19,2,5,1};
int index=-1;
//查找元素第一次出现的位置
try(Scanner input=new Scanner(System.in)){System.out.println("请输入要查找的元素");int target=input.nextInt();//案例1:查找在无序数组中目标元素第一次出现的位置for(int i=0;i<array.length;i++){if(array[i]==target){index=i;System.out.println("%d第一次出现的位置是%d",target,index);break;}}System.out.println();index=-1;//案例2:查找在无序数组中目标元素最后一次出现的位置for(int i=array.length-1;i>=0;i--){if(array[i]==target) {index=i;System.out.printf("%d最后一次出现的位置是%d",target,index);break;}}

输出:请输入要查找的元素
输入:1

输出:
1第一次出现的位置是2
1最后一次出现的位置是8

字符串数组

String[] singerArray = { "李荣浩", "盘尼西林", "王菲", "王贰浪", "鹿先森乐            队","孙燕姿", "G.E.M.邓紫棋", "方大同", "品冠儿子" };int count=0;int index=-1;System.out.println("请输入你要查找的歌手:");try(Scanner input=new Scanner(System.in)){String target=input.next();for(int i=0;i<singerArray.length;i++) {count++;//String字符串的等值比较,必须用equals方法if(singerArray[i].equals(target)) {index=i;break;}	}System.out.printf("%s的位置在%d,查找了%d次",target,index,count);}

输出:请输入你要查找的歌手:
输入:孙燕姿
输出:孙燕姿的位置在5,查找了6次 

双指针遍历查找--字符串数组

String[] singerArray = { "李荣浩", "盘尼西林", "王菲", "王贰浪", "鹿先森乐        队","孙燕姿", "G.E.M.邓紫棋", "方大同", "品冠儿子" };
int count=0;
int index=-1;
try(Scanner input=new Scanner(System.in)){System.out.println("请输入你要查找的歌手:");String target=input.next();	for(int i=0,k=singerArray.length-1;i<=k;i++,k--) {count++;//从头开始比较if(singerArray[i].equals(target)){index=i;break;}//从尾部开始比较if(singerArray[k].equals(target)){index=k;break;}}
System.out.printf("%s的位置在%d,查找了%d次",target,index,count);
}

 输出:请输入你要查找的歌手:
输入:孙燕姿
 输出:孙燕姿的位置在5,查找了4次

双指针的查找次数少,效率更高

三、有序数组查找

二分查找

作用

        在一个有序数组中,如果需要进行指定元素的查找,可以采用二分查找(binarySearch),这样会比通过遍历数组来进行查找的效率高很多。以下是二分查找的代码实现:

int[] num={1,3,5,7,8};
int target=3;
int index=-1;
//数组的首元素和尾元素
int low=0,high=num.length-1;while(low<=high){int mid=(low+high)/2;//判断mid是否等于targetif(num[mid]==target){index=mid;//如果等于代表查找成功,则循环退出break;}else if(num[mid]>target){//此时代表目标元素可能在mid的左半区hight=mid-1;}else if(num[mid]<target){//此时代表目标元素可能在mid的右半区low=mid+1;}
}
System.out.printf("%d的位置为%d",target,index);

输出结果:3的位置为1 

Arrays工具类查找

        在Java的标准库中也为我们内置了二分查找,可以直接通过调用Arrays.binarySearch()的方法进行查找:由于该方法基于二分查找,所以进行排序的数组必须是有序的,所以我们可以先使用Arrays.sort()进行排序,再调用Arrays.binarySearch()进行查找

int[] array={28,12,89,73};
int target=12;
//先排序
Arrays.sort(array);
//在查找
int index=Arrays.binarySearch(array,target);System.out.println("%s的位置在%d",target,index)

输出结果:12的位置在1  

四、数组乱序

算法简述

         题目:将一个数组中所有元素的顺序都打乱。

        那不是直接用Math.random()*100重复50次不就好了吗?不,Math.random()的重复概率很大,不能保证50个数字每个都不同,所以我们为大家介绍一种算法:乱序算法

实现步骤

①假设有一个等待乱序的数组P

②从P中随机选取一个未乱序的元素

③将该元素与数组P中最后一个元素交换

④重复2、3两个步骤直到数组P中所有元素全部完成排序

代码实现

int[] number= {11,12,13,14,15,16,17};
System.out.println("乱序前:"+Arrays.toString(number));
for(int i=number.length-1;i>0;i--){//产生随机下标int randomIndex=(int)(Math.random()*i);//交换元素number[i]=number[i]^number[randomindex];number[randomindex]=number[i]^number[randomindex];number[i]=number[i]^number[randomindex];
}
System.out.println("乱序后:"+Arrays.toString(number));

输出结果:

乱序前:[11, 12, 13, 14, 15, 16, 17]
乱序后:[12, 16, 17, 15, 11, 13, 14]

应用

题目:产生7个不重复的1-33的数字

int[] num=new int[33];
for(int i=0;i<num.length;i++){num[i]=i+1;
}
System.out.println("乱序前:"+Arrays.toString(number));
//先乱序
for(int i=num.length;i>0;i--){int randindex=(int)(Math.random()*i);num[i]=num[randindex]^num[i];num[randindex]=num[randindex]^num[i];num[i]=num[randindex]^num[i];
}
//存前7个
int[] n=new int[7];
System.arraycopy(num,0,n,0,n.length);
System.out.println("乱序后:"+Arrays.toString(number));

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]
[21, 12, 8, 26, 16, 5, 25]
 

五、数组旋转

算法描述

数组向右旋转3位:将尾元素通过不断旋转,交换到头部

数组向左旋转三位:将头元素通过不断旋转,交换到尾部

 

代码实现 

向右旋转

//遍历的顺序:从尾部开始
//交换的双方:k和k-1

int[] number= {1,2,3,4,5,6,7};
//向右旋转3次
//外层循环控制旋转次数,向右旋转3次
for(int i=0;i<3;i++){//内层循环控制旋转方向,每次向右旋转一位//遍历的顺序:从尾部开始//交换的双方:k和k-1for(int k=number.length;k>0;k--){number[k]=number[k]^number[k-1];number[k-1]=number[k]^number[k-1];number[k]=number[k]^number[k-1];}
}
System.out.println("向右旋转3次:"+Arrays.toString(number));

 输出结果:向右旋转3次:[5, 6, 7, 1, 2, 3, 4]

向左旋转

//遍历的顺序:从头部开始
//交换的双方:k和k+1

int[] number= {1,2,3,4,5,6,7};
//外层循环控制旋转次数,向左旋转3次
for(int i=0;i<3;i++) {
//内层循环控制旋转方向,每次向左旋转一位for(int k=0;k<number.length-1;k++){number[k]=number[k]^number[k+1];number[k+1]=number[k]^number[k+1];number[k]=number[k]^number[k+1];  }
}
System.out.println("向左旋转3次:"+Arrays.toString(number));      

输出结果:向左旋转3次:[4, 5, 6, 7, 1, 2, 3]

写作不易,如果帮到了你就点赞收藏吧!!

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

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

相关文章

【STM32详解FLASH闪存编程原理与步骤】

STM32详解FLASH闪存编程原理与步骤 FLASH编程注意事项FLASH编程过程STM32的FLASH擦除过程FLASH全片擦除FLASH操作总结锁定解锁函数写操作函数擦除函数获取状态函数等待操作完成函数读FLASH特定地址数据函数 FLASH编程注意事项 1.STM32复位后&#xff0c;FPEC模块是被保护的&am…

【二】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

教学管理系统201703153 教学管理系统数据库展示 成绩表展示 课程表展示 学生表展示 院系表展示 一、基本操作 设置复合主键 设置其他表的主键 设置字段取值范围 二、简单操作 第一题 第二题 第三题 第四题 结尾 最后&#xff0c;感谢您阅读我的文章&#xff0c;希望这些内容能…

网工内推 | 华为成都研究所,24届应届生人才储备计划

华为成都研究所 招聘岗位 网络工程师&#xff08;2024应届&#xff09; 岗位要求 24届的学员 本科公办院校 英语4/6级 有HCIP优先 工作地点 成都 私信小编&#xff0c;回复【内推】&#xff0c;获取内推名额申请资格~ 想获取更多『 思科 | 华为 | 红帽 认证真题 』、『 网…

stl的基本知识学习

1.vector&#xff1a; 2.set&#xff1a; 3.map&#xff1a; 4.栈&#xff1a; 5.队列&#xff1a; 6. unordered_map与unordered_set: 7. 位运算&#xff1a; 8.cctype&#xff1a; 导图&#xff1a;

基础50刷题之一(交替合并字符串)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解&#xff08;双指针&#xff09;三、文心一言解释总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没学&a…

进制算法题(进制转换、Alice和Bob的爱恨情仇)

进制的本质 对于一个十进制数字&#xff0c;比如说153&#xff0c;其本质是每一个数位上的数字乘上这一位上的权重&#xff0c;即:153(1x)(5x)(3 x)而二进制&#xff0c;只不过是把10换成了2&#xff0c;任意一个非负整数都有唯一的一个二进制表示: 在计算机中&#xff0c;数字…

python+django+vue电影票订购系统dyvv4

电影院订票信息管理系统综合网络空间开发设计要求。目的是将电影院订票通过网络平台将传统管理方式转换为在网上操作&#xff0c;方便快捷、安全性高、交易规范做了保障&#xff0c;目标明确。电影院订票信息管理系统可以将功能划分为用户和管理员功能[10]。 语言&#xff1a;…

HM2019创建分析模型

步骤一&#xff1a;查看单元类类型&#xff08;通过card edit&#xff09;&#xff0c;然后展开模型查看模型信息&#xff1b;步骤二&#xff1a;为材料集里添加新的材料 材料:Al 弹性模量E:70000 泊松比NU:0.33 其中&#xff1a;MAT1表示各向同性材料&#xff0c;E表示弹…

百度搜索引擎SEO优化方法

随着互联网的不断发展&#xff0c;搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国&#xff0c;百度作为最大的搜索引擎&#xff0c;其影响力不可忽视。了解并掌握百度SEO关键词优化方法&#xff0c;对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…

Android应用开发data android:schemes标签的作用

文章目录 data android:schemesAndroidManifest.xml 中 <data> 元素的属性详解 data android:schemes 在 AndroidManifest.xml 文件中&#xff0c; 标签的作用是指定该应用可以处理的 URI 方案。 URI 是统一资源标识符&#xff0c;它是一种用于标识资源的标准方法。URI…

chrome浏览器离线安装及历史版本的下载

背景&#xff1a;测试web功能在浏览器各版本的兼容性&#xff0c;需要用到旧版本的浏览器&#xff0c;当用户环境无法访问到互联网&#xff0c;需要下载离线版本安装&#xff1b; 1、在线版本安装 需要当前环境能正常使用互联网&#xff1a; 目前能访问的官网地址&#xff1…

【C++精简版回顾】19.异常处理

1.throw抛出问题 int print(int a,int b) {if (b 0)throw b;return a / b; } 2.try与catch解决问题 try {print(2, 0); } catch (int b) {cout << "竟然是&#xff1a;"<<b<<endl; } 结果&#xff1a; 补充1&#xff1a;可以抛出字符串等 1.throw…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…

下载、安装Notepad++代码编辑器的方法

本文介绍下载、安装Notepad 软件的方法。 关于Notepad&#xff0c;只能说从软件自身角度还算个东西&#xff1b;其是一款免费的代码、文本编辑器&#xff08;通过一些插件&#xff0c;它也可以成为编译器&#xff0c;不过我没试过&#xff09;&#xff0c;是广受大家欢迎的开源…

蓝桥杯备赛 day2 | 4. 付账问题 5. 数字三角形

付账问题&#xff0c;关键是要了解整型的范围&#xff0c;确定获取输入数据的变量类型 需要注意的是int的十进制范围-32768 ~ 32767&#xff0c;那么我们可以知道&#xff0c;人数n是可以用int来装的&#xff0c;需付款数S应该是long long&#xff0c;获取的每个人初始钱数也应…

22万字大模型面经整理+答案

槽位对齐&#xff08;slot alignment&#xff09; 在text2sql任务中&#xff0c;槽位对齐&#xff08;slot alignment&#xff09;通常指的是将自然语言问题中的关键信息&#xff08;槽位&#xff09;与数据库中的列名或API调用中的参数进行匹配的过程。这个过程中&#xff0c…

内衣洗衣机名牌排行榜前十名:十款强大性能内衣洗衣机精心力荐

小型内衣洗衣机一般是为婴儿宝宝&#xff0c;或者一些有特殊需要的用户而设计使用的&#xff0c;宝宝衣物换洗频繁&#xff0c;而且对卫生方面的除菌要求高&#xff0c;而为避免交叉感染&#xff0c;所以一般不适合和大人的衣物放在一起洗&#xff0c;因此对于有宝宝的家庭来说…

用友NC saveDoc.ajax 任意文件上传漏洞复现

产品介绍 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 漏洞描述 用友NC 系统 saveD…

接口测试要怎么测?接口测试的流程和步骤详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 我们要想知道接口测试怎么做&#xff0c;首…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…