一、数组涉及的算法

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

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

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

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

new一次有一个地址(堆中开辟一个空间)

3.1 练习

使用简单数组

  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。

  5. 思考:array1和array2是什么关系?array1和array2地址值相同,都指向堆空间中唯一的数组实体

  6. 拓展:修改题目,实现array2对array1数组的复制

  1. package com.atguigu.exer;
  2. import java.lang.reflect.Array;
  3. /*
  4. * 使用简单数组
  5. (1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,
  6. 他们是int[]类型的数组。
  7. (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
  8. (3)显示array1的内容。
  9. (4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
  10. (如array[0]=0,array[2]=2)。打印出array1。
  11. 思考:array1和array2是什么关系?array1和array2地址值相同,都指向堆空间中唯一的数组实体
  12. 拓展:修改题目,实现array2对array1数组的复制
  13. */
  14. public class ArrayExer2 {
  15. public static void main(String[] args) {
  16. //声明
  17. int[] array1,array2 = null;//arr在栈中,存储的是地址值
  18. array1 = new int[]{2,3,5,11,13,17,19};
  19. //显示array1的内容
  20. for(int i = 0;i < array1.length;i++){
  21. System.out.println(array1[i] + "\t");
  22. }
  23. //赋值array2变量等于array1
  24. //不能称作数组的复制。他们指向的地址一样,并没有开辟新的内存空间,只是把array1的地址值给array2
  25. array2 = array1;
  26. //修改array2中偶索引元素,使其等于索引值(如array[0] = 0,array[2] = 2)
  27. for(int i = 0;i < array2.length;i++){
  28. if(i % 2 == 0){
  29. array2[i] = i;
  30. }
  31. }
  32. System.out.println();
  33. //打印出aray1
  34. for(int i = 0;i < array1.length;i++){
  35. System.out.println(array1[i]);
  36. }
  37. }
  38. }

数值的赋值

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

  1. package com.atguigu.java;
  2. /*算法的考查:数值的复制、反转、查找(线性查找、二分查找)*/
  3. public class ArrayTest2 {
  4. public static void main(String[] args) {
  5. String[] arr = new String[]{"JJ","DD","MM","AA","BB"};
  6. //数组的复制(区别于数组变量的赋值:arr1 = arr)
  7. String[] arr1 = new String[arr.length];
  8. for(int i =0;i < arr1.length;i++){
  9. arr1[i] = arr[i];
  10. }
  11. //数组的反转
  12. //方法一:
  13. for(int i = 0;i < arr.length / 2;i++){
  14. String temp = arr[i];
  15. arr[i] = arr[arr.length - 1 -i];
  16. arr[arr.length - 1 -i] = temp;
  17. }
  18. //方法二:
  19. for(int i = 0,j = arr.length - 1;i < j;i++,j--){
  20. String temp = arr[i];
  21. arr[i] = arr[j];
  22. arr[j] = temp;
  23. }
  24. //遍历
  25. for(int i = 0;i <arr.length;i++){
  26. System.out.print(arr[i] + "\t");
  27. }
  28. //查找(或搜索)
  29. //线性查找:
  30. String dest = "BB";
  31. boolean isFlag = true;
  32. for(int i = 0;i < arr.length;i++){
  33. if(dest.equals(arr[i])){//equals值
  34. System.out.println("指定元素:位置为: " + i);
  35. isFlag = false;
  36. break;
  37. }
  38. }
  39. if(isFlag){
  40. System.out.println("很遗憾,没有找到哦");
  41. }
  42. //二分法查找
  43. //前提:所查找的数组必须有序。
  44. int[] arr2 = new int[]{-98,-32,2,5,42,66,88};
  45. int dest1 = -34;
  46. int head = 0;//初始的首索引
  47. int end = arr2.length;//初始的末索引
  48. boolean isFlag1 = true;
  49. while(head <= end){
  50. int middle = (head + end)/2;
  51. if(dest1 == arr2[middle]){
  52. System.out.println("找到了指定元素,位置为:" + middle);
  53. isFlag1 = false;
  54. break;//找到跳出循环
  55. }else if(arr2[middle] > dest1){
  56. end = middle -1;
  57. }else{//arr2[middle] < dest1
  58. head = middle + 1;
  59. }
  60. }
  61. if(isFlag1){
  62. System.out.println("很遗憾,没有找到哦");
  63. }
  64. }
  65. }

四、数组元素的排序算法

4.1 冒泡排序(会写代码)

  1. package com.atguigu.java;
  2. public class BubbleSortTest {
  3. public static void main(String[] args) {
  4. //在队中开辟空间,并赋值
  5. int[] arr = new int[]{43,86,12,0,95,};
  6. //冒泡排序
  7. for(int i = 0;i < arr.length - 1;i++){
  8. for(int j = 0;j < arr.length - 1 - i;j++){
  9. if(arr[j] > arr[j+1] ){
  10. int temp = arr[j];
  11. arr[j] = arr[j+1];
  12. arr[j+1] = temp;
  13. }
  14. }
  15. }
  16. }
  17. }

4.2 快速排序(会写代码)

  1. package com.atguigu.java;
  2. /**
  3. * 快速排序
  4. * 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,
  5. * 则分别对这两部分继续进行排序,直到整个序列有序。
  6. */
  7. public class QuickSort {
  8. private static void swap(int[] data, int i, int j) {
  9. int temp = data[i];
  10. data[i] = data[j];
  11. data[j] = temp;
  12. }
  13. private static void subSort(int[] data, int start, int end) {
  14. if (start < end) {
  15. int base = data[start];
  16. int low = start;
  17. int high = end + 1;
  18. while (true) {
  19. while (low < end && data[++low] - base <= 0)
  20. ;
  21. while (high > start && data[--high] - base >= 0)
  22. ;
  23. if (low < high) {
  24. swap(data, low, high);
  25. } else {
  26. break;
  27. }
  28. }
  29. swap(data, start, high);
  30. subSort(data, start, high - 1);//递归调用
  31. subSort(data, high + 1, end);
  32. }
  33. }
  34. public static void quickSort(int[] data){
  35. subSort(data,0,data.length-1);
  36. }
  37. public static void main(String[] args) {
  38. int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
  39. System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
  40. quickSort(data);
  41. System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
  42. }
  43. }

4.3 堆排序(知道思想)

4.4 归并排序(知道思想)

4.5 排序算法性能对比

以nlog2n的速度归队

五、Arrays工具类的使用

  1. boolean equals(int[] a,int[] b) 判断两个数组是否相等。
  2. String toString(int[] a) 输出数组信息。
  3. void fill(int[] a,int val) 将指定值填充到数组之中。
  4. void sort(int[] a) 对数组进行排序。
  5. int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。
  1. package com.atguigu.java;
  2. import java.util.Arrays;
  3. /*
  4. * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
  5. */
  6. public class ArraysTest {
  7. public static void main(String[] args) {
  8. //判断两个数组是否相等。
  9. //1. boolean equals(int[] a,int[] b)
  10. int[] arr1 = new int[]{1,2,3,4};
  11. int[] arr2 = new int[]{1,3,2,4};
  12. boolean isEquals = Arrays.equals(arr1,arr2);
  13. System.out.println(isEquals);
  14. //输出数组信息。
  15. //2. String toString(int[] a)
  16. System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4]
  17. //将指定值填充到数组之中。 把原来数组每个元素都替换成10
  18. //3. void fill(int[] a,int val)
  19. Arrays.fill(arr1, 10);
  20. System.out.println(Arrays.toString(arr1));//[10, 10, 10, 10]
  21. //对数组进行排序。
  22. //4. void sort(int[] a)
  23. Arrays.sort(arr2);
  24. System.out.println(Arrays.toString(arr2));
  25. //对排序后的数组进行二分法检索指定的值。
  26. //5. int binarySearch(int[] a,int key)
  27. int[] arr3 = new int[]{-98,-32,2,34,66,88,99,210};
  28. int index = Arrays.binarySearch(arr3,210);
  29. if(index >= 0){
  30. System.out.println(index);
  31. }else{
  32. System.out.println("找不到");
  33. }
  34. }
  35. }

六、 数组使用中的常见异常

  1. package com.atguigu.java;
  2. /*
  3. 1.数组脚标越界异常(ArrayIndexOutOfBoundsException)
  4. 2.空指针异常(NullPointerException)
  5. */
  6. public class ArrayExceptionTest {
  7. public static void main(String[] args) {
  8. //1.数组脚标越界异常(ArrayIndexOutOfBoundsException)
  9. int[] arr = new int[]{1,2,3,4,5};
  10. /*for(int i = 0;i <= arr.length;i++){
  11. System.out.println(arr[i]);
  12. }*/
  13. //System.out.println(arr[-2]);
  14. //2.空指针异常(NullPointerException)
  15. //情况一:
  16. /*int[] arr1 = new int[]{1,2,3};
  17. arr1 = null;
  18. System.out.println(arr1[0]);*/
  19. //情况二:
  20. /*int[][] arr2 = new int[4][];
  21. System.out.println(arr2[0]);//null
  22. System.out.println(arr2[0][0]);//空指针异常
  23. */
  24. //情况三:
  25. /*String[] arr3 = new String[]{"AA","BB","CC"};
  26. arr3[0] = null;
  27. System.out.println(arr3[0].toString());//空指针异常
  28. */
  29. }
  30. }