当前位置: 移动技术网 > IT编程>开发语言>Java > java:数组及数组常用算法总结

java:数组及数组常用算法总结

2020年07月27日  | 移动技术网IT编程  | 我要评论

java:数组常用部分算法的详细总结

一、概念

数组是一种容器,可以储存同一种类型的元素的“容器”;

注意:

数组每一个元素用下标,来表示元素,

​ 下标由0开始,而不是1,

所以:

最后一位元素下标比实际长度小一个数字单位;

二、定义

数据类型 [] 数组名称;

三、数组的初始化

动态初始化:定义数组时,指定数组长度,系统默认自动为数组元素赋初始值

​				格式:数据类型 [] 数组名称 =new 数据类型[数组长度];

静态初始化:直接指定数组元素内容,系统指定数组长度;

​				格式:数据类型 [] 数组名称 =new 数据类型 []{x1,x2,x3........};

​							简写:数据类型 [] 数组名称={x1,x2,x3......}; 

错误写法:

​				数据类型 [] 数组名称 = new 数据类型[数组长度]{x1,x2,x3...};
注意:中括号 [] ,可写在数组名称前后,不会出现语法错误,依照个人习惯即可;

示例代码:

public static void main(String[] args) {
    
		//动态初始化:  定义了数组长度为6的整型数组arr;
		int [] arr=new int[6];
		//静态初始化:  定义了数组长度为3的整型数组arr2;
		int [] arr2=new int[] {1,2,3};
		//静态初始化简写:   定义了直接写入元素1,2,3的整型数组arr3;
		int [] arr3= {1,2,3};		
	}

四、数组的经典算法应用

1、数组遍历

思路:运用for循环依次遍历数组元素,并输出;

public static void main(String[] args) {
		//静态初始化了 一个长度为6的整形数组arr;
		int [] arr= {1,2,3,4,5,6};
		//for循环遍历数组 并显示
		//此处输出代码为了输出美观而写,非必要;
		System.out.print("数组内容:[");
		for(int x=0;x<arr.length;x++) {
			if(arr.length-1==x) {
				System.out.print(arr[x]+"]");
			}else {
				System.out.print(arr[x]+",");
			}
		}
	}

运行结果:

数组内容:[1,2,3,4,5,6]

2、数组中找最大数

思路:

1、假设对比,假设一个最大数;

2、运用for循环依次向后对比每一个数组元素;

3、大于假定数的成为最大值,并输出;

public static void main(String[] args) {
		//静态初始化了 一个长度为6的整形数组arr,找出它的最大数;
		int [] arr= {20,60,52,70,90,4};
		//假定一个最大值max;
		int max=0;
		//for循环依次比较输出
		for(int x=0;x<arr.length;x++) {
			//大于最大值的元素,成为最大值,与下一个元素进行比较
			if(arr[x]>max) {
				max=arr[x];
			}
		}
		System.out.println("最大数为:"+max);		
	}

运行结果:

数组最大数为:90

3、数组元素逆序

思路:对数组进行逆向排序

1、分析可得出中间区间在任何情况一定是不存在或不移动的;

2、所以利用for循环,将数组一分为二对前后对比对称元素

两两交换位置,循环结束,得到结果并输出;

public static void main(String[] args) {
		//静态初始化了 一个长度为6的整形数组arr,对它进行逆向输出;
		int [] arr= {1,2,3,4,5,6};
		System.out.println("逆序排序前的数组:");
		getShow(arr);
		//for循环
		//length/2将数组一分为二
		for(int x=0;x<arr.length/2;x++) {
			//元素交换的中间变量
			    int temp=0;
				temp=arr[x];
				arr[x]=arr[arr.length-1-x];
				arr[arr.length-1-x]=temp;		
		}
		//输出方法
		System.out.println("逆序排序后的数组:");
		getShow(arr);
	
	}
	//遍历输出方法
	public static void getShow(int [] arr) {
		System.out.print("[");
		for(int x=0;x<arr.length;x++) {
			if(arr.length-1==x) {
				System.out.println(arr[x]+"]");
			}else {
				System.out.print(arr[x]+",");
			}
		}
	}

运行结果:

逆序排序前的数组:
[1,2,3,4,5,6]
逆序排序后的数组:
[6,5,4,3,2,1]

四、数组简单查询

思路:

1、for循环遍历数组,依次对比,if==判断查询元素是否存在于数组;

2、存在返回下标,不存在返回-1;

public static void main(String[] args) {
		//静态初始化了 一个长度为6的整形数组arr,对它进行逆向输出;
		int [] arr= {1,2,3,4,5,6};
		//查找数字5在 数组arr中的位置;
		findArr(arr, 5);	
	}
	
	//元素查找方法  参数为 arr 所要查询的数组,key 查询的数字
	//查找到返回元素下标
	//未查找到返回-1
	public static int findArr(int [] arr,int key) {
		int index=-1;
		for(int x=0;x<arr.length;x++) {
			if(arr[x]==key) {
				System.out.println("所查询的数字在数组下标为 :"+x);
				break;
			}
		}
		return -1;	
	}

运行结果:

所查询的数字在数组下标为 :4

五、数组二分查找法

二分法前提:数组有序

思路:1、设置一个 数组下标中间值变量mid, 初始值为: (上界-下界)/2的数组下标;

​ 2、设置一个 数组下标上界变量top 初始值为:数组最后一个元素下标;

​ 3、设置一个 数组下标下界变量bottom 初始值为:数组第一个元素下标;

​ 4、for循环,将所查找元素与mid下标数组变量 循环对比;

​ 5、若查找元素大于mid,则mid变量+1,变为bottom,同时mid进行重新计算;

​ 6、若查找元素小于mid,则mid变量-1,变为top,同时mid进行重新计算;

​ 7、对查询结果进行输出;查询不到在输出后提前输出结果;

	public static void main(String[] args) {
		//静态初始化了 一个长度为6的整形数组arr,对它进行逆向输出;
		int [] arr= {1,2,3,4,5,6};
		//查找数字5在 数组arr中的位置;
		findArr(arr, 5);
		
	}
	//二分元素查找法
	//查找到返回下标,提前判断围在数组情况;
	public static void findArr(int [] arr,int key) {
		//定义初始界定变量
		int top=arr.length-1;
		int bottom=0;
		//提前判断所查询数据是否在数组内
		if(key>arr[top]||key<arr[bottom]) {
			System.out.println("所查询数值没有在数组之内");
		}
		//for循环判断查找
		for(int x=0;x<arr.length;x++) {
			//将mid 定义在for循环内部 才能动态改变中间值;
			int mid=(top+bottom)/2;
			//若参数key=中间变量mid,则返回查询结果
			if(key==arr[mid]) {
				System.out.println("已查询到数组元素 "+key+" 的数组下标为:"+mid);
				break;
			}
			//若查找元素大于mid,则mid变量+1,变为bottom,同时mid进行重新计算;	
			if(key>arr[mid]) {
			
				bottom=mid+1;
			}
			//若查找元素小于mid,则mid变量-1,变为top,同时mid进行重新计算;
			if(key<arr[mid]){		
				top=mid-1;
			}
		}		
	}

运行结果:

已查询到数组元素 5 的数组下标为:4

六、冒泡排序

思路:

1、比较相邻两个元素,左边元素大于右边元素,则左右交换;

2、每一对相邻元素向后依次这样比较,直到已比较交换出最大元素放置在数组最后一位;

3、遍历数组,再次循环上述步骤,除去上一轮和已经选出的最大元素(随着选出的最大数值愈来愈多,两两比较次数会相应减少);

public class Test {
		public static void main(String[] args){
		//定义一个数组arr
		int [] arr= {3,5,4,1,2};
		//排序前的数组
		System.out.println("排序前的数组:");
		printShow(arr); 
		
		//外层控制再次重复步骤
		for(int i=0;i<arr.length-1;i++){
			//内层for循环控制 控制数组元素两两比较次数
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]>arr[j+1]) {
					//temp作为中间值 
					//如果前一项大于后一项 则交换位置
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
		}		
	}
		//输出排序后的数组
		System.out.println("排序后的数组:");
		printShow(arr); 
	}
	//遍历数组并显示方法
	public static void printShow(int [] arr) {
				System.out.println("数组如下:");
				System.out.print("[");
				for(int i=0;i<arr.length;i++) {
					if(i==arr.length-1) {
						System.out.print(arr[i]+"]");
					}else {
						System.out.print(arr[i]+",");
					}
				}
				System.out.println("");
	}
}

运行结果:

排序前的数组:
数组如下:
[3,5,4,1,2]
排序后的数组:
数组如下:
[1,2,3,4,5]

结语:数组应用非常广泛,上面总结介绍了数组的部分常用算法,以及数组的定义方式;熟能生巧,大家可以仿照上面实例的代码多加练习;

不是吧,不是吧,!,不会真的有人不点赞吧!。。!!

本文地址:https://blog.csdn.net/qq_43137699/article/details/107579081

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网