数组中涉及到的常见算法

209 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。

1.1 两类排序

(1)内排序:指待排序列完全存放在内存中所进行的排序。内排序大致可分为五类:插入排序、交换排序、选择排序、归并排序和分配排序。

(2)外排序:指排序过程中还需访问外存储器的排序。为了以后讨论方便,我们直接将排序码写成一个一维数组的形式,并且在没有声明的情形下,所有排序都按排序码的值递增排列。

1.2 数组中涉及到的常见算法

1.数组元素的赋值(杨辉三角、回形数等)

2.求数值型数组中元素的最大值、最小值、平均数、总和等

3.数组的复制、反转、查找(线性查找、二分法查找)

4.数组元素的排序算法

1.1 杨辉三角

package com.pyy.contact;

/*
 * 杨辉三角要满足的条件是
 * yanghui[i][j] = yanghui[i-1][j] + yanghui[i-1][j-1];
 */

public class YangHuiTest {
	public static void main(String[] args) {
		// 1.声明并初始化二维数组
		int[][] yangHui = new int[10][];

		// 2.给数组的元素赋值
		for (int i = 0; i < yangHui.length; i++) {
			yangHui[i] = new int[i + 1]; // 第一行一个元素,第二行二个元素...
			// 2.1给首末元素赋值
			yangHui[i][0] = yangHui[i][i] = 1;
			// 2.2给每行的非首末元素赋值
			for (int j = 1; j < yangHui[i].length - 1; j++) {
				yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
			}
		}

		// 3.遍历数组
		for (int i = 0; i < yangHui.length; i++) {
			for (int j = 0; j < yangHui[i].length; j++) {
				System.out.print(yangHui[i][j] + " ");
			}
			System.out.println();
		}

	}
}

1.2 输出数组中最大、最小、和、平均数的值

定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。

要求:所有随机数都是两位数。

如何通Math.random()获得指定取区间的数字

Math.random():[0.0,1)

Math.random()*90:[0.0,90.0)

(int)(Math.random()*90):[0,89]

(int)(Math.random()*90 + 10):[10,99]

公式:获取[a,b]范围的随机数:

(int)(Math.random()*(b-a) + a)

package com.pyy.contact;

/*
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
要求:所有随机数都是两位数。
 */
public class MaxNumber {
	public static void main(String[] args) {
		int[] arr = new int[10];

		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * (99 - 10 + 1) + 10);
		}

		// 求数组元素的最大值
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();

		// 求数组元素的最大值
		int maxValue = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (maxValue < arr[i]) {
				maxValue = arr[i];
			}
		}
		System.out.println("最大值为:" + maxValue);

		// 求数组元素的最小值
		int minValue = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (minValue > arr[i]) {
				minValue = arr[i];
			}
		}
		System.out.println("最小值为:" + minValue);

		// 求数组元素的总和
		int sumValue = 0;
		for (int i = 1; i < arr.length; i++) {
			sumValue += arr[i];
		}
		System.out.println("和为:" + sumValue);

		// 求数组元素平均数
		double avgValue = sumValue / arr.length;
		System.out.println("平均数:" + avgValue);

	}
}

赋值

int [] array1,array2
array1 = new int[]{2,3,4,5,7,6};

array2 = array1

两个不同的变量指向了同一个地址

image-20211031215420148

复制

array2 = new int[array1.length];

for(int i = 0;i < array2.length;i++){

	array2[i] = array1[i];

}

我们通过new的方式,给array2在堆空间中新开辟了数组的空间,将array1的元素一个一个的赋值到array2数组中

数组的反转

for(int i = 0;j = arr.length - 1;i<j;i++,j--){
	String temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}