1、昨日复习

1.写出一维数组初始化的两种方式
int[] arr = new int[5];//动态初始化

String[] arr1 = new String[]{“Tom”,”Jerry”,”Jim”};//静态初始化

数组一旦初始化,其长度就是确定的。arr.length
数组长度一旦确定,就不可修改。


2.写出二维数组初始化的两种方式
int[][] arr = new int[4][3];//动态初始化1
int[][] arr1 = new int[4][];//动态初始化2

int[][] arr2 = new int[][]{{1,2,3},{4,5,6},{7,8}};//静态初始化


3.如何遍历如下的二维数组
int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};

for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + “\t”);
}
System.out.println();
}


4.不同类型的一维数组元素的默认初始化值各是多少
整型 : 0
浮点型:0.0
char:0
boolean :false
引用类型:null


5.一维数组的内存解析:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];


了解即可
数据结构:
1、数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
2、数据的存储结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
图形结构:

算法:
排序算法:
搜索算法:


  1. 使用二维数组打印一个 10 行杨辉三角。 【提示】
  2. 1. 第一行有 1 个元素, n 行有 n 个元素
  3. 2. 每一行的第一个元素和最后一个元素都是 1
  4. 3. 从第三行开始, 对于非第一个元素和最后一个元
  5. 素的元素。即:
  6. yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
  7. package com.atguigu.java;
  8. public class Practice {
  9. public static void main(String[] args) {
  10. int[][] yangHui = new int[10][];
  11. for (int i = 0; i < yangHui.length; i++) {
  12. yangHui[i] = new int[i + 1];
  13. for (int j = 0; j < i + 1; j++) {
  14. if (j == 0) {
  15. yangHui[i][j] = 1;
  16. } else if (j == i) {
  17. yangHui[i][j] = 1;
  18. } else if (i >= 2 && j != 0 && j != i) {
  19. yangHui[i][j] = yangHui[i - 1][j - 1] + yangHui[i - 1][j];
  20. } else {
  21. continue;
  22. }
  23. }
  24. }
  25. for (int i = 0; i < yangHui.length; i++) {
  26. for (int j = 0; j < yangHui[i].length; j++) {
  27. System.out.print(yangHui[i][j] + "\t");
  28. }
  29. System.out.println();
  30. }
  31. }
  32. }
  33. //我的代码
  1. package com.atguigu.java;
  2. public class Practice2 {
  3. public static void main(String[] args) {
  4. // 1、声明并初始化二维数组
  5. int[][] yangHui = new int[10][];
  6. // 2、给数组元素赋值
  7. for (int i = 0; i < yangHui.length; i++) {
  8. yangHui[i] = new int[i + 1];
  9. // 2.1给首末元素赋值
  10. yangHui[i][0] = yangHui[i][i] = 1;
  11. // 2.2给每行的非首末元素赋值
  12. if (i > 1) {//if可去掉
  13. for (int j = 1; j < yangHui[i].length - 1; j++) {
  14. yangHui[i][j] = yangHui[i - 1][j - 1] + yangHui[i - 1][j];
  15. }
  16. }
  17. }
  18. // 3、遍历二维数组
  19. for (int i = 0; i < yangHui.length; i++) {
  20. for (int j = 0; j < yangHui[i].length; j++) {
  21. System.out.print(yangHui[i][j] + " ");
  22. }
  23. System.out.println();
  24. }
  25. }
  26. }
  27. //老师写的

2、数组中涉及的常见算法

2.1 数组元素的赋值

  1. 【拓展之笔试题】
  2. 创建一个长度为6int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求
  3. 元素的值各不相同。
  4. package com.atguigu.java;
  5. import java.util.Random;
  6. /*
  7. * 【拓展之笔试题】
  8. 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求
  9. 元素的值各不相同。
  10. */
  11. public class Practice3 {
  12. public static void main(String[] args) {
  13. // 1、创建数组
  14. int[] arr = new int[6];
  15. int number = 0;
  16. // 2、赋值
  17. // 2.1赋值并判断
  18. for (int i = 0; i < arr.length; i++) {
  19. number = (int) (Math.random() * 30 + 1);
  20. if(i >0){
  21. for(int j=0;j<i;j++){
  22. if(arr[j]==number){
  23. i--;
  24. break;
  25. }else{
  26. arr[i] =number;
  27. }
  28. }
  29. } else{
  30. arr[i] =number;
  31. }
  32. }
  33. // 3、遍历
  34. for (int i1 = 0; i1 < arr.length; i1++) {
  35. System.out.println(arr[i1]);
  36. }
  37. }
  38. }
  39. //我写的
  1. int[] arr = new int[6];
  2. for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
  3. arr[i] = (int) (Math.random() * 30) + 1;
  4. for (int j = 0; j < i; j++) {
  5. if (arr[i] == arr[j]) {
  6. i--;
  7. break;
  8. }
  9. }
  10. }
  11. for (int i = 0; i < arr.length; i++) {
  12. System.out.println(arr[i]);
  13. }
  14. }
  15. }
  16. //老师的

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

  1. package com.atguigu.java;
  2. /*
  3. 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
  4. 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
  5. 要求:所有随机数都是两位数。
  6. */
  7. public class Practice4 {
  8. public static void main(String[] args) {
  9. //1 定义一个int型的一维数组,包含10个元素
  10. int[] arr = new int[10];
  11. //2 分别赋一些随机整数,
  12. for (int i = 0; i < 10; i++) {
  13. arr[i] = (int) (Math.random() * 90 + 10);
  14. }
  15. for(int i=0;i<10;i++){
  16. System.out.print(arr[i]+" ");
  17. }
  18. System.out.println();
  19. //3 求出所有元素的最大值,最小值,和值,平均值,并输出出来。
  20. //3.1 最大值
  21. int max=0;
  22. for(int i=0;i<10;i++){
  23. if(arr[i]>max){
  24. max=arr[i];
  25. }
  26. }
  27. System.out.println("最大值是:"+max);
  28. //3.2 最小值
  29. int min=0;
  30. for(int i=0;i<10;i++){
  31. if(arr[i]<min){
  32. min=arr[i];
  33. }
  34. }
  35. System.out.println("最小值是:"+min);
  36. //3.3 和值,平均值
  37. int sum=0;
  38. int avage=0;
  39. for(int i=0;i<10;i++){
  40. sum+=arr[i];
  41. }
  42. avage=sum/10;
  43. System.out.println("和值是:"+sum+",平均值是:"+avage);
  44. }
  45. }

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

  1. package com.atguigu.java;
  2. /*
  3. * 使用简单数组
  4. (1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,
  5. 他们是int[]类型的数组。
  6. (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
  7. (3)显示array1的内容。
  8. (4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
  9. (如array[0]=0,array[2]=2)。打印出array1。
  10. */
  11. public class Practice5 {
  12. public static void main(String[] args) {
  13. int[] array1 = new int[]{2,3,5,7,11,13,17,19};
  14. int[] array2;
  15. for(int i=0;i<array1.length;i++){
  16. System.out.print(array1[i]+" ");
  17. }
  18. System.out.println();
  19. array2=array1;
  20. for(int i=0;i<array2.length;i++){
  21. if(i%2==0){
  22. array2[i]=i;
  23. }
  24. }
  25. for(int i=0;i<array1.length;i++){
  26. System.out.print(array1[i]+" ");
  27. }
  28. }
  29. }
  30. 思考:array1array2是什么关系?array1array2地址值一样
  31. 拓展:修改题目,实现array2array1数组的复制

QQ截图20211206165223.png

  1. //查找
  2. //线性查找:
  3. //二分法查找:要求此数组必须是有序的。

2.4 数组元素的排序算法

排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为
{K1,K2,…,Kn}。将这些记录重新排序为{Ri1,Ri2,…,Rin},使得相应的关键
字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序。
通常来说,排序的目的是快速查找。
衡量排序算法的优劣:
1.时间复杂度:分析关键字的比较次数和记录的移动次数
2.空间复杂度:分析排序算法中需要多少辅助内存
3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
排序算法分类:内部排序和外部排序。
内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。
外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助 于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。

QQ截图20211207141537.png
要求:知道有十种,冒泡排序和快速排序必须要会手写,堆排序和归并排序了解思想
QQ截图20211207142118.png

  1. package com.atguigu.java;
  2. public class Practice7 {
  3. public static void main(String[] args) {
  4. int[] arr = new int[] { 43, 32, 76, -98, 0, 64, 33, -21, 32, 99 };
  5. // 冒泡排序
  6. for (int i = 0; i < arr.length - 1; i++) {
  7. for (int j = 0; j < arr.length - i - 1; j++) {
  8. if(arr[j]>arr[i]){
  9. int temp=arr[j];
  10. arr[j]=arr[j+1];
  11. arr[j+1]=temp;
  12. }
  13. }
  14. }
  15. for (int i = 0; i < arr.length; i++) {
  16. System.out.print(arr[i] + "\t");
  17. }
  18. }
  19. }

附录:尚硅谷宋红康排序算法.pdf

3、Arrays工具类的使用

QQ截图20211207151007.png
QQ截图20211207152207.png

4、数组的总结