数组中涉及的常见算法:3、数组的复制、反转、查找(线性查找、二分法查找)

数组中涉及的常见算法

1、数组元素的赋值(杨辉三角、回形数等)
2、求数值型数组中元素的最大值、最小值、平均数、总和等
3、数组的复制、反转、查找(线性查找、二分法查找)
4、数组元素的排序算法

第三类:数组的复制、反转、查找(线性查找、二分法查找)

使用简单数组
(1)创建一个名为ArrayExer2的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2。array[3]=3,array[4]=4)。打印出array1。

class Test{
  	public static void main(String[ ] args){
  	
		//创建一个名为ArrayExer2的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
		int[] array1,array2;
		
		//使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
		array1 = new int[]{2,3,5,7,11,13,17,19};
		
		//显示array1的内容。
		for (int i = 0;i<array1.length;i++){
		System.out.println(array1[i]);
		}
		
		//赋值array2变量等于array1,
		//不能称作是数组的复制。
		array2 = array1;
		
		//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2,array[3]=3,array[4]=4)。
		for(int i = 0;i < array2.length;i++){
			if(i % 2==0){
				array2[i]=i;
			}
		}
		System.out.println();//换行
		
		for (int i = 0;i<array1.length;i++){
			//打印出array1。
			System.out.println(array1[i]);
		}
	}
}
  • 思考一:为什么后打印的array1是0,3,2,7,4,13,6,19

因为第四步array2 = array1;所以array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。
所以修改array2和修改array1一样。

  • 思考二:array1和array2是什么关系?

array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。

  • 拓展:修改题目,实现array2对array1数组的复制
class Test{
  	public static void main(String[ ] args){
		
		//创建一个名为ArrayExer2的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
		int[] array1,array2;
		
		//使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
		array1 = new int[]{2,3,5,7,11,13,17,19};
		
		//输出array1的内容。
		for (int i = 0;i<array1.length;i++){
			System.out.println(array1[i]);
		}
		
		//数组的复制
		array2 = new int[array1.length];
		for(int i = 0;i < array2.length;i++){
				array2[i]=array1[i];
		}
		
		//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2,array[3]=3,array[4]=4)。
		for(int i = 0;i < array2.length;i++){
			if(i % 2==0){
				array2[i]=i;
			}
		}
		System.out.println();
		
		for (int i = 0;i<array1.length;i++){
			//打印出array1。
			System.out.println(array1[i]);
		}
	}
}

此时后输出的array1即和先前的array1相同。
因为我们在这其中已经new了一个和array1相同的array2.所以修改的array2是array2的地址值。与array1无关。

解释如下图。

数组中涉及的常见算法:3、数组的复制、反转、查找(线性查找、二分法查找)_第1张图片
数组中涉及的常见算法:3、数组的复制、反转、查找(线性查找、二分法查找)_第2张图片

数组的反转:

public class Test {
	public static void main(String[] args) {
		
		String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
		
		//数组的复制(区别于数组变量的赋值:arr1 = arr)
		String[] arr1 = new String[arr.length];
		for(int i = 0;i < arr1.length;i++){
			arr1[i] = arr[i];
		}
		//遍历输出
		for(int i =0;i<arr.length;i++){
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		/**
		//数组的反转
		//方法一:定义一个变量
		for(int i = 0;i < arr.length/2;i++){
			String temp = arr[i];
			arr[i] = arr[arr.length - i - 1 ];
			arr[arr.length - i - 1 ] = temp;
		}
		**/
		//方法二:定义两个变量
		for(int i =0,j = arr.length - 1;i < j;i++,j--){
			String temp = arr[i];
			arr[i] = arr[j];
			arr[arr.length - i -1] = temp;
		}
		//反转后遍历输出
		for(int i =0;i<arr.length;i++){
			System.out.print(arr[i] + "\t");
		}
		
	}
}

数组的查找(线性查找、二分法查找):

线性查找

class Test {
	public static void main(String[] args) {
	
		String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
		
		//遍历输出所有元素
		for(int i =0;i<arr.length;i++){
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		//线性查找
		String dest = "cc";//所要查找的
		
		boolean isFlag = true;//
		
		for(int i = 0;i < arr.length;i++){
			if(dest.equals(arr[i])){
				System.out.println("找到了指定的元素,索引位置为:"+i+"\t"+"元素为:"+arr[i]);
				isFlag = false;
				break;
			}
		}
		if(isFlag){
			System.out.println("很遗憾,没有找到");
		}
	}
}

二分法查找(比线性查找要快)

前提:所要查找的数组必须有序

class Test {
	public static void main(String[] args) {

		int[] arr2 = new int[] { -98, -34, 2, 34, 54, 66, 79, 105, 210, 333 };

		int dest1 = 105;
		int head = 0;// 初始的首索引
		int end = arr2.length - 1;// 初始的末索引
		boolean isFlag = true;
		while (head <= end) {

			int middle = (head + end) / 2;

			if (dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为:" + middle);
				isFlag = false;
				break;
			} else if (arr2[middle] > dest1) {
				end = middle - 1;
			} else if (arr2[middle] < dest1) {// 也可以写成else{ 因为是在后半段寻找
				head = middle + 1;
			}
		}
		if (isFlag) {
			System.out.println("很遗憾,没有找到");
		}
	}
}

你可能感兴趣的:(#,java数组)