3.4 数组常见算法:
-
数组元素的赋值(杨辉三角、回形数等)
-
求数值型数组中元素的最大值、最小值、平均数、总和等
-
数组的复制、反转、查找(线性查找、二分法查找)
-
数组元素的排序算法
1 杨辉三角:
代码示例:
public class ArrayExer1 {
public static void main(String[] args) {
// 1.声明并初始化二维数组
int[][] arr = new int[10][];
// 2.给数组元素赋值
for(int i = 0;i < arr.length;i++) {
arr[i] = new int[i + 1];
// 2.1 给首末元素赋值
arr[i][0] = arr[i][i] = 1;
// 2.2 给每行的非首末元素赋值
if(i > 1) {
for(int j = 1;j < arr[i].length - 1;j++) {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
// 3.遍历二维数组
for(int i = 0;i < arr.length;i++) {
for(int j = 0;j < arr[i].length;j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
- 求数值型数组中元素的最大值、最小值、平均数、总和等
/*
* 算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等
*
* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
* 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
* 要求:所有随机数都是两位数。
*
* [10,99]
* 公式:(int)(Math.random() * (99 - 10 + 1) + 10)
*/
public class ArrayExer2 {
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 sum = 0;
for(int i = 0;i < arr.length;i++){
sum += arr[i];
}
System.out.println("总和为:" + sum);
//求数组元素的平均数
int avgValue = sum / arr.length;
System.out.println("平均数为:" + avgValue);
}
}
结果:
25 15 23 19 26 50 96 98 39 74
最大值为:98
最小值为:15
总和为:465
平均数为:46
- 数组的复制、反转、查找(线性查找、二分法查找)
// 3. 数组的复制、反转、查找(线性查找、二分法查找)
public class ArrayTest1 {
public static void main(String[] args) {
String[] arr = new String[] {"wuwuwu","yingyingying","jijiji","hahaha"};
// 数组的复制
// 定义String型数组arr1,并将arr数组元素长度赋给数组arr1(使arr1数组元素长度和arr数组元素长度相等)
String[] arr1 = new String[arr.length];
for(int i = 0;i < arr1.length;i++) {
arr1[i] = arr[i];
// System.out.print(arr1[i] + " ");
}
// 数组的反转
// 方式一:
for(int i = 0;i < arr.length / 2;i++) {
String temp = arr[i]; // temp:临时变量
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[j] = temp;
}
// 遍历
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + " ");
}
// 查找(或搜索)
// 1.线性查找
String dest = "hahaha";
boolean isFlag = true;
for(int i = 0;i < arr.length;i++) {
if(dest.equals(arr[i])) {
System.out.println("找到了指定的元素,位置为:" + i);
isFlag = false;
break;
}
}
if(isFlag) {
System.out.println("很遗憾,没有找到哦!");
}
// 二分法查找:
// 前提:所要查找的数组必须有序
int[] arr2 = new int[] {-98,-34,2,34,53,66,79,105,210,333};
int dest1 = -34;
int head = 0; // 初始的首索引
int end = arr2.length - 1; // 初始的末索引
boolean isFlag1 = true;
while(head <= end) {
int middle = (head + end)/2;
if(dest1 == arr2[middle]) {
System.out.println("找到了指定的元素,位置为:" + middle);
isFlag1 = false;
break;
}else if(arr2[middle] > dest1) {
end = middle - 1;
}else {
end = middle + 1;
}
}
if(isFlag1) {
System.out.println("很遗憾,没有找到哦!");
}
}
}
练习:使用简单数组
(1)创建一个名为ArrayTest的类,在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)。打印出array1
思考:array1和array2是什么关系? array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体
拓展:修改题目,实现array2对array1数组的复
代码示例:
public class ArrayExer3 {
public static void main(String[] args) {
// 1. 声明两个int型数组
int[] array1,array2;
// 2.把array1初始化为8个素数:2,3,5,7,11,13,17,19。
array1 = new int[] {2,3,5,7,11,13,17,19};
// 3.显示array1的内容。
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + " ");
}
// 4.赋值array2变量等于array1
// 不能称作数组的复制
array2 = array1; // 将 array1 的地址值赋给了 array2
// 修改array2中的偶索引元素,使其等于索引 (如array[0]=0,array[2]=2)
for(int i = 0;i < array2.length;i++) {
if(i % 2 == 0) {
array2[i] = i;
}
}
System.out.println();
// 打印出array1
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + " ");
}
}
}
拓展:修改题目,实现array2对array1数组的复制
ublic class ArrayExer4 {
public static void main(String[] args) {
// 1. 声明两个int型数组
int[] array1,array2;
// 2.把array1初始化为8个素数:2,3,5,7,11,13,17,19。
array1 = new int[] {2,3,5,7,11,13,17,19};
// 3.显示array1的内容。
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + " ");
}
// 4.赋值array2变量等于array1
// 数组的复制
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++) {
array2[i] = array1[i];
}
// 修改array2中的偶索引元素,使其等于索引 (如array[0]=0,array[2]=2)
for(int i = 0;i < array2.length;i++) {
if(i % 2 == 0) {
array2[i] = i;
}
}
System.out.println();
// 打印出array1
for(int i = 0;i < array1.length;i++) {
System.out.print(array1[i] + " ");
}
}
}
- 数组元素的排序算法:
- 算法的特征:
输入(Input) | 有0个或多个输入数据,这些输入必须有清楚的描述和定义 |
---|---|
输出(Output) | 至少有1个或多个输出结果,不可以没有输出结果 |
有穷性(有限性,Finiteness) | 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤 |
可以在可接受的时间内完成 | |
确定性(明确性,Definiteness) | 算法中的每一步都有确定的含义,不会出现二义性 |
可行性(有效性,Effectiveness) | 算法的每一步都是清楚且可行的,能让用户用纸笔计算而求出答案 |
- 十大内部排序算法:
- 选择排序:直接选择排序、堆排序🔺
- 交换排序: 冒泡排序🔺、快速排序🔺
- 插入排序: 直接插入排序、折半插入排序、Shell排序
- 归并排序🔺
- 桶式排序
- 基数排序
- 数组的冒泡排序的实现:
介绍:
冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
排序思想:
-
比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。
代码示例:
public class ArrayTest2 {
public static void main(String[] args) {
int[] arr = new int[] {11,45,65,12,89,102,37,85};
// 冒泡排序
for(int i = 0;i < arr.length - 1;i++) {
for(int j = 0;j < arr.length - 1 - i;j++) {
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}
// 遍历
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
}