数组常见算法代码总结

一、数组排序【冒泡排序】(优化) 

1.基本实现思路:

数组排序是通过冒泡排序算法实现的,基本实现思路是比较相邻的元素,把小的元素往前移动或把大的元素往后移动,相邻元素两两进行比较,若大元素在小元素前面则发生交换(通过^异或运算实现)或者小元素在大元素后面则发生交换,若两个元素相等,则不交换。

冒泡排序口诀:

/*
 * N个数字来排序
 * 两两比较小(大)靠前
 * 总共比较N-1轮 每轮
 * 比较N-1-i次
*/

2.代码实现:

  • 冒泡排序

1)int类型的数组

package com.ztt.exercise.Demo03;import java.util.Arrays;//冒泡排序/** N个数字来排序* 两两比较小(大)靠前* 总共比较N-1轮 每轮* 比较N-1-i次*/public class demo01 {public static void main(String[] args) {//无序数组int[] numbers= {1,9,6,7,2,8};System.out.println("排序前:"+Arrays.toString(numbers));int counter=0;//比较n-1轮for(int i=0,n=numbers.length;i<n-1;i++) {//是否已经处于“有序”状态//true代表有序//false代表无序boolean isSorted=true;//每轮比较n-1-i次for(int k=0;k<n-1-i;k++) {counter++;//相邻元素比较 交换:使用异或运算 两两异或 进行三次if(numbers[k]>numbers[k+1]) {numbers[k]=numbers[k]^numbers[k+1];numbers[k+1]=numbers[k]^numbers[k+1];numbers[k]=numbers[k]^numbers[k+1];isSorted = false;}}if(isSorted) {break;}}System.out.println("优化后总共比较了:"+counter+"次");System.out.println("排序后:"+Arrays.toString(numbers));}}

输出结果:

排序前:[1, 9, 6, 7, 2, 8]
优化后总共比较了:14次
排序后:[1, 2, 6, 7, 8, 9]

2)char类型的数组 

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo02 {public static void main(String[] args) {char[] arr= {'a','c','e','d','f','j','g'};System.out.println("排序前:"+Arrays.toString(arr));int counter=0;//比较n-1轮for(int i=0 ,n=arr.length;i<n-1;i++) {boolean isSorted=true;//每轮比较n-1-i次for(int k=0;k<n-1-i;k++) {counter++;//相邻元素比较 交换if(arr[k]>arr[k+1]) {arr[k]=(char)(arr[k]^arr[k+1]);arr[k+1]=(char)(arr[k]^arr[k+1]);arr[k]=(char)(arr[k]^arr[k+1]);isSorted=false;}}if(isSorted) {break;}}System.out.println("优化后总共比较了:"+counter+"次");System.out.println("排序后:"+Arrays.toString(arr));}}

输出结果:

排序前:[a, c, e, d, f, j, g]
优化后总共比较了:11次
排序后:[a, c, d, e, f, g, j]

3)String类型的数组  

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo03 {public static void main(String[] args) {String[] names= {"tian","lucy","bill","herry","deal","candy"};System.out.println("排序前:"+Arrays.toString(names));int counter=0;//比较n-1轮for(int i=0,n=names.length;i<n-1;i++) {boolean isSorted=true;//每轮比较n-1-i次for(int k=0;k<n-1-i;k++) {counter++;//相邻元素比较 交换if(names[k].compareTo(names[k+1])>0) {String temp=names[k];names[k]=names[k+1];names[k+1]=temp;isSorted=false;}}if(isSorted) {break;}}System.out.println("优化后总共比较了:"+counter+"次");System.out.println("排序后:"+Arrays.toString(names));}}

输出结果:

排序前:[tian, lucy, bill, herry, deal, candy]
优化后总共比较了:15次
排序后:[bill, candy, deal, herry, lucy, tian]
  • 通过Arrays工具类的sort()方法 
package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo04 {public static void main(String[] args) {// 通过Arrays工具类的sort()方法char[] arr= {'l','k','j','h','g','f','d','s','a'};System.out.println(arr);Arrays.sort(arr);System.out.println(arr);}}

输出结果:

lkjhgfdsa
adfghjkls

二、无序数组查找 

1.基本实现思路:

无序数组查找是通过双指针查找实现的基本实现思路是:使用for循环,通过两个下标,分别从数组的头部和尾部遍历该无序数组,将数组中的每个元素与指定元素进行比较,从而确定该数组中是否存在目标元素。查找到了返回该元素在数组中所在的下标,没有查找到返回-1。

2.代码实现:

package com.ztt.exercise.Demo03;import java.util.Scanner;public class demo05 {public static void main(String[] args) {// “无序数组”中指定元素的查找//双指针int[] array= {28,12,89,73,65,18,12,96,50,8,36};try (Scanner input = new Scanner(System.in)){int target= input.nextInt();//目标元素int index=-1;//目标元素下标,默认为-1,代表不存在//案例1:查找在“无序数组”中目标元素第一次出现的位置for(int i=0;i<array.length;i++) {if(array[i]==target) {index=i;break;}}//案例2:查找在“无序数组”中目标元素最后一次出现的位置//方式1:从头部开始遍历,依次查找for(int i=0;i<array.length;i++) {if(array[i]==target) {index=i;}}//方式2:从尾部开始遍历,依次查找for(int i=array.length-1;i>=0;i--) {if(array[i]==target) {index=i;break;}}System.out.printf("元素%d的下标是%d",target,index);	}}}package com.ztt.exercise.Demo03;import java.util.Scanner;public class demo06 {public static void main(String[] args) {// 查找String[] singerArray = { "李荣浩", "盘尼西林", "王菲", "王贰浪", "鹿先森乐队", "孙燕姿", "G.E.M.邓紫棋", "方大同", "品冠儿子" };try (Scanner input = new Scanner(System.in)){String target= input.next();int index=-1;for(int i=0,k=singerArray.length-1;i<=k;i++,k--) {//从头开始比较//String字符串的等值比较,必须用equalsif(singerArray[i].equals(target)) {index=i;break;}//从尾部开始比较if(singerArray[k].equals(target)) {index=k;break;}}System.out.println(index);	}}
}

输出结果:

73
元素73的下标是36
元素6的下标是-1王贰浪
3张甜甜
-1​

三、有序数组查找(二分查找)

1.基本实现思路:

有序数组查找是通过二分查找(Binary Search)算法实现的,二分查找算法的基本实现思路是
定义一个
有序的数组,以及要查找的目标整数 target
初始化 index 为 -1,用于存储找到的目标元素的下标;数组的起始下标
 low=0 和 结束下标 high =(numbers.length - 1)
使用 while 循环,条件是 low <= high。这意味着只要搜索区间不为空,就继续查找。
在每次循环中,计算中间位置 mid,它是 low 和 high 的平均值(向下取整)。
使用 if-else 语句判断中间位下标的元素是否与目标元素相等

如果 中间位置的元素 = target,则找到了目标元素,将 index 设置为 mid 并break跳出循环。
如果 中间位置的元素 < target,则目标元素在 mid 的右侧,更新 low 为 mid + 1。
如果 中间位置的元素 > target,则目标元素在 mid 的左侧,更新 high 为 mid - 1。
循环结束后,输出 index。如果找到了目标元素,index 将是目标元素在数组中的下标;如果没有找到,index 将为 -1。

2.代码实现:

  • 二分查找

1)int类型的数组

package com.ztt.exercise.Demo03;public class demo07 {public static void main(String[] args) {//二分查找算法int[] numbers= {1,2,3,4,5,6,7,8,9};int target=3;int index=-1;//数组的“首”+“尾”int low=0,high=numbers.length-1;while(low<=high) {//计算当前位“中间位”下标int mid=(low+high)/2;//判断中间位下标的元素是否与目标元素相等if(numbers[mid]==target) {index=mid;break;}else if(numbers[mid]<target){low=mid+1;}else if(numbers[mid]>target) {high=mid-1;}}System.out.println(index);}}

输出结果:

2

2)char类型的数组 

package com.ztt.exercise.Demo03;public class demo08 {public static void main(String[] args) {char[] keys = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n' };char target='h';int index=-1;int low=0,high=keys.length-1;while(low<=high) {int mid=(low+high)/2;if(keys[mid]==target) {index=mid;break;}else if(keys[mid]>target){high=mid-1;}else if(keys[mid]<target) {low=mid+1;}}System.out.println(index);}}

输出结果:

7

3)String类型的数组

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo09 {public static void main(String[] args) {String[] contactArray = { "egatron","s司马铁锤","s司马铁锤","Laden", "angelababy","b比尔盖饭","l林平之","BIGBANG" , "Adele Adkins", "m马云","Gaddafi", "g郭德纲","m马伯庸","Ma Tong Seok"};String target="m马云";int index=-1;//先排序Arrays.sort(contactArray);System.out.println(Arrays.toString(contactArray));int low=0,high=contactArray.length-1;while(low<=high) {int mid=(low+high)/2;if(contactArray[mid].compareTo(target)==0) {index=mid;break;}else if(contactArray[mid].compareTo(target)>0){high=mid-1;}else if(contactArray[mid].compareTo(target)<0) {low=mid+1;}}System.out.println(index);}}

输出结果:

[Adele Adkins, BIGBANG, Gaddafi, Laden, Ma Tong Seok, angelababy, b比尔盖饭, egatron, g郭德纲, l林平之, m马云, m马伯庸, s司马铁锤, s司马铁锤]
10
  •  通过Arrays工具类的binarySearch()方法  
package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo03 {public static void main(String[] args) {int[] array= {28,12,89,73,65,18,96,50,8,36};int target=36; //目标元素//先排序Arrays.sort(array);System.out.println(Arrays.toString(array));//再查找int index=Arrays.binarySearch(array, target);System.out.println(index);}
}

输出结果:

[8, 12, 18, 28, 36, 50, 65, 73, 89, 96]
4

四、数组乱序 

1.基本实现思路:

数组乱序 基本实现思路是:对一个打乱顺序的数组,通过for循环逆序遍历产生随机下标,从数组的最后一个元素(数组的长度-1)开始到第二个元素(i>0),设置一个随机数作为循环中遍历到的元素之前的所有元素的下标,即可从该元素之前的所有元素中随机取出一个每次将随机取出的元素与遍历到的元素交换,即可完成乱序

 2.代码实现:

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo10 {public static void main(String[] args) {// 乱序排序int[] numbers={11,13,14,16,19};System.out.println(Arrays.toString(numbers));System.out.println();for(int i=numbers.length-1; i>0;i--) {int index=(int)(Math.random()*i);numbers[index]=numbers[index]^numbers[i];numbers[i]=numbers[index]^numbers[i];numbers[index]=numbers[index]^numbers[i];}System.out.println(Arrays.toString(numbers));}}package com.ztt.exercise.Demo03;public class demo11 {
public static void main(String[] args) {String[] playMusicList = { "1反方向的钟", "2七里香", "3半岛铁盒", "4双节棍", "5晴天", "6青花瓷", "7一路向北", "8稻香" };for(int i=playMusicList.length-1;i>0;i--) {int randIndex=(int)(Math.random()*i);String temp=playMusicList[i];playMusicList[i] = playMusicList[randIndex];playMusicList[randIndex] = temp;}for(String music :playMusicList ) {System.out.println(music);}}}

输出结果:

[11, 13, 14, 16, 19][13, 16, 11, 19, 14]6青花瓷
1反方向的钟
8稻香
2七里香
4双节棍
7一路向北
3半岛铁盒
5晴天

五、数组旋转 

1.基本实现思路:

数组旋转基本实现思路是:

向右旋转:从数组的尾部开始遍历(逆序遍历)逐步向前移动,每次都将当前元素与其前一个元素交换(通过^异或运算实现),直到到达数组的开始位置。这样,数组就实现了向右旋转一位的效果。重复旋转,由于外层循环执行了3次,所以数组总共向右旋转了3位。

向左旋转:从数组的头部开始遍历(顺序遍历)逐步向后移动,每次都将当前元素与其后一个元素交换(通过^异或运算实现),直到到达数组的结束位置。这样,数组就实现了向左旋转一位的效果。重复旋转,由于外层循环执行了3次,所以数组总共向左旋转了3位。

 2.代码实现:

1)向右旋转

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo12 {public static void main(String[] args) {// 数组旋转int[] numbers= {1,2,3,4,5,6,7};//外层循环:控制旋转的位数,循环3次代表旋转3次for(int i=0; i<3;i++) {//内层循环:控制旋转的方向,每次向右旋转1位//向右旋转:将尾部元素通过不断交换,交换至数组头部//遍历的方向:从尾部开始(逆序)//交换的双方:当前元素k 与 前一个元素k-1//每次向右旋转1位for(int k=numbers.length-1;k>0;k--) {//交换numbers[k]=numbers[k]^numbers[k-1];numbers[k-1]=numbers[k]^numbers[k-1];numbers[k]=numbers[k]^numbers[k-1];}}System.out.println(Arrays.toString(numbers));}}

输出结果:

[5, 6, 7, 1, 2, 3, 4]

2)向左旋转

package com.ztt.exercise.Demo03;import java.util.Arrays;public class demo13 {public static void main(String[] args) {// 数组旋转int[] numbers= {1,2,3,4,5,6,7};//外层循环:控制旋转的位数,循环3次代表旋转3次for(int i=0; i<3;i++) {//内层循环:控制旋转的方向,每次向左旋转1位//向左旋转:将头部元素通过不断交换,交换至数组尾部//遍历的方向:从头部开始(顺序)//交换的双方:当前元素k 与 前一个元素k+1//每次向左旋转1位for(int k=0;k<numbers.length-1;k++) {//交换numbers[k]=numbers[k]^numbers[k+1];numbers[k+1]=numbers[k]^numbers[k+1];numbers[k]=numbers[k]^numbers[k+1];}}System.out.println(Arrays.toString(numbers));}}

输出结果:

[4, 5, 6, 7, 1, 2, 3]

 

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

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

相关文章

RocketMQ订阅关系不一致和不能消费时如何排查?

订阅关系不一致 调整任意一个实例的订阅关系和另一个保持一致 消费者不能消费消息 它是最常见的问题之一&#xff0c;也是每个消息队列服务都会遇到的问题 1.确认哪个消息未消费。在这时消费者至少需要手机消息id、消息key、消息发送时间段三者之一 2.确认消息是否发送成功…

HashMap使用静态初始化块添加元素

使用静态初始化块&#xff08;Static Initialization Block&#xff09; 示例代码&#xff1a; import java.util.HashMap; import java.util.Map;public class Main {public static void main(String[] args) {// 使用静态初始化块批量添加元素Map<String, Integer> h…

JVM--- 垃圾收集器详细整理

目录 一、垃圾收集需要考虑的三个事情&#xff1a; 二、垃圾回收针对的区域 三、如何判断对象已死 1.引用计数算法&#xff1a; 2.可达性分析算法 四、引用 五、生存还是死亡&#xff1f; 六、回收方法区 七、垃圾收集算法 1.分代收集理论 2.标记-清除算法 3.标记-复制算…

huggingface库LocalTokenNotFoundError:需要提供token

今天刚开始学习huggingface&#xff0c;跑示例的时候出了不少错&#xff0c;在此记录一下&#xff1a; (gpu) F:\transformer\transformers\examples\pytorch\image-classification>.\run.bat Traceback (most recent call last):File "F:\transformer\transformers\e…

一站式安装对应显卡版本的cuda和torch(windows)

前言 一年前&#xff0c;安装过cuda&#xff0c;觉得并不难&#xff0c;就没有记录。 这次安装还算顺利&#xff0c;就是在找资料的时候&#xff0c;浪费了不少时间 这次就记录下来&#xff0c;方便以后再次安装 总结安装程序&#xff1a; 1、安装python环境 2、安装VS的C环境&…

【机构vip教程】Unittest(1):unittest单元测试框架简介

unittest单元测试框架简介 unittest是python内置的单元测试框架&#xff0c;具备编写用例、组 织用例、执行用例、功能&#xff0c;可以结合selenium进行UI自动化测 试&#xff0c;也可以结合appium、requests等模块做其它自动化测试 官方文档&#xff1a;https://docs.pytho…

机试指南:3-4章

文章目录 第3章 排序与查找(一) 排序1.sort函数&#xff1a;sort(first,last,comp)2.自定义比较规则3.C函数重载&#xff1a;同一个函数名&#xff0c;有不同的参数列表4.机试考试最重要的事情&#xff1a;能把你曾经做过的题目&#xff0c;满分地做出来5.例题例题1&#xff1a…

xtu oj 1162 奇偶校验

题目描述 奇偶校验是一种在通讯中经常使用的&#xff0c;用来确认传输的字节是否正确的手段。 对于一个BYTE(8BIT),我们使用0~6bit来存储数据&#xff0c;称为数据位&#xff0c;第7位存储奇偶校验位。 如果数据位有偶数个1&#xff0c;那么第7位为0&#xff0c;否则为1。现给…

markdown绘制流程图相关代码片段记录

有时候会使用typora来绘制一些流程图&#xff0c;进行编码之类的工作&#xff0c;在网络搜集了一些笔记&#xff0c;做个记录&#xff0c;方便日后进行复习&#xff0c;相关的记录如下&#xff1a; 每次作图时&#xff0c;代码以「graph <布局方向>」开头&#xff0c;如…

kettle--JavaScript脚本日期使用

输入日期为20240216&#xff0c;运行如下代码&#xff0c;结果为true var reportdate parent_job.getVariable("v_reportdate"); var date_type parent_job.getVariable("v_date_type"); var reportdate_freportdate.substr(0,4) "/" report…

P3141 [USACO16FEB] Fenced In P题解

题目 如果此题数据要小一点&#xff0c;那么我们可以用克鲁斯卡尔算法通过&#xff0c;但是这个数据太大了&#xff0c;空间会爆炸&#xff0c;时间也会爆炸。 我们发现&#xff0c;如果用 MST 做&#xff0c;那么很多边的边权都一样&#xff0c;我们可以整行整列地删除。 我…

RK3399平台开发系列讲解(USB篇)U盘等存储类设备

🚀返回专栏总目录 文章目录 一、什么是U盘等存储类设备二、U盘设备传输数据结构三、U盘识别需要打开的宏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍U盘等存储类设备。 一、什么是U盘等存储类设备 USB Mass Storage Device Class(USB MSC/UMS) USB大容量存…

springboot199疫情打卡健康评测系统

疫情打卡健康评测系统设计与实现 摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花…

[AIGC] 了解消息队列事务:保证数据一致性的关键

在分布式系统中&#xff0c;消息队列是一种常见的解耦手段&#xff0c;可以帮助我们简化复杂系统的架构设计&#xff0c;提高系统的可靠性和可扩展性。但是&#xff0c;在使用消息队列时&#xff0c;我们需要注意一个重要的问题&#xff1a;保证数据的一致性。在这篇文章中&…

《剑指 Offer》专项突破 - 面试题 43 : 在完全二叉树中添加节点(两种方法 + C++ 实现)

目录 前言 方法一 方法二 前言 题目链接&#xff1a;LCR 043. 完全二叉树插入器 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在完全二叉树中&#xff0c;除最后一层之外其他层的节点都是满的&#xff08;第 n 层有 个节点&#xff09;。最后一层的节点可能…

IO进程-day1

1、使用fgets统计给定文件的行数。 #include<stdio.h> #include<string.h> #include<stdlib.h>int main(int argc, const char *argv[]) {if(argc ! 2){printf("inout file error\n");printf("usage:./a.out srcfile destfile\n");ret…

理德外汇名人故事:全球著名的基金经理——布鲁斯·科夫纳

纽约华尔街&#xff08;wall street&#xff09;是纽约市曼哈顿区南部一条大街的名字&#xff0c;长不超过一英里&#xff0c;宽仅11米。它是美国一些主要金融机构的所在地。两旁是陈旧的摩天大楼&#xff0c;这条街上集中了纽约证券交易所、联邦储备银行等金融机构和美国洛克菲…

深入了解C语言:基础、特性与实践

C语言是一门广泛应用于系统编程和嵌入式领域的高效编程语言。通过深入了解其基础、特性以及实际应用&#xff0c;我们能够更好地掌握这门语言&#xff0c;提高编程技能。在本博客中&#xff0c;我们将探讨C语言的各个方面&#xff0c;从基础概念到高级应用&#xff0c;为读者提…

在golang语言中简单使用protobuf时遭遇go_package困难重重

文章目录 前言编写示例示例初始化编写协议文件内容导出协议文件protoc 和 protoc-gen-go执行导出命令 编写协议使用文件 体会总结 前言 Protobuf&#xff0c;全称Protocol Buffers&#xff0c;是一种由Google开发的用于序列化结构化数据的开源数据交换格式&#xff0c;Golang作…

在UE5中使用体积材质

在平时使用UE的材质设置时&#xff0c;经常会看见Material Domain Volume类型&#xff0c;但是却很少使用。其实该类型可以配合体积雾使用&#xff0c;并制作体积效果以弥补自带雾参数的不足。 操作流程 首先找到场景中的ExponentialHeightFog组件&#xff0c;开启体积雾Volu…