尚学堂 JAVA DAY11 概念总结
1.冒泡排序算法 《升序排列》
思路1:
数组长度为n,那么要对数组进行n-1次遍历;
step 1---从数组的第一个数开始,两两比较,如果第一个数 > 第二个数,将二者进行交换;
之后拿第二个数与第三个数进行比较,若 第二个数 > 第三个数,将二者进行交换;
依此类推,直到 第n-2个数 和 第n-1个数比较完。
此时,该数组中最大的数将排在数组的最后一个位置。
step 2---重复step1,直到遍历完整个数组。
1 public class NewArray { 2 public static void main(String[] args) { 3 //声明并定义一个无序的数组 4 int[] scores = new int[15]; 5 for(int i = 0; i < scores.length; i++) { 6 scores[i] = (int)(Math.random() * 101); 7 } 8 9 //排序前 打印数组 10 System.out.println("\n==============排序前===================="); 11 for(int score : scores) { 12 System.out.print(score + " "); 13 } 14 15 //排序进行时 升序排列 16 int temp = 0; 17 int counter = 0; 18 for(int j = 0; j < scores.length - 1; j++) { 19 for(int i = 0; i < scores.length - 1; i++) { 20 if(scores[i] > scores[i+1]) { 21 temp = scores[i]; 22 scores[i] = scores[i+1]; 23 scores[i+1] = temp; 24 } 25 } 26 counter++; 27 } 28 29 //排序后 打印数组 30 System.out.println("\n==============排序后===================="); 31 for(int score : scores) { 32 System.out.print(score + " "); 33 } 34 35 System.out.println("\n======================================"); 36 System.out.println("共进行了" + counter + "次比较"); 37 } 38 }
思路2:
数组长度为n,那么要对数组进行n-1次遍历;
step 1---从数组的第一个数开始,两两比较,交换,直到数组元素的(索引 == 数组长度 - 1 - 第i次)遍历数组结束。
step 2---重复step1,直到数组遍历结束。
public class NewArray { public static void main(String[] args) { //声明并定义一个无序的数组 int[] scores = new int[15]; for(int i = 0; i < scores.length; i++) { scores[i] = (int)(Math.random() * 101); } //排序前 打印数组 System.out.println("\n==============排序前===================="); for(int score : scores) { System.out.print(score + " "); } //排序进行时 升序排列 int temp = 0; int counter = 0; for(int j = 0; j < scores.length - 1; j++) { for(int i = 0; i < scores.length - 1 - j; i++) { if(scores[i] > scores[i+1]) { temp = scores[i]; scores[i] = scores[i+1]; scores[i+1] = temp; } } counter++; } //排序后 打印数组 System.out.println("\n==============排序后===================="); for(int score : scores) { System.out.print(score + " "); } System.out.println("\n======================================"); System.out.println("共进行了" + counter + "次比较"); } }
思路3:
数组长度为n,那么要对数组进行n-1次遍历;
step 1---从数组的第一个数开始,两两比较,交换,直到数组元素的(索引 == 数组长度 - 1 - 第i次)遍历数组结束。
step 2---重复step1,直到数组中没有发生元素的交换为止。
1 public class NewArray { 2 public static void main(String[] args) { 3 //声明并定义一个无序的数组 4 int[] scores = new int[15]; 5 for(int i = 0; i < scores.length; i++) { 6 scores[i] = (int)(Math.random() * 101); 7 } 8 9 //排序前 打印数组 10 System.out.println("\n==============排序前===================="); 11 for(int score : scores) { 12 System.out.print(score + " "); 13 } 14 15 //排序进行时 升序排列 16 int temp = 0; 17 int counter = 0; 18 boolean hasChanged = false; 19 for(int j = 0; j < scores.length - 1; j++) { 20 //每一次遍历开始都认为数列无序,数据未发生过交换 21 hasChanged = false; 22 for(int i = 0; i < scores.length - 1 - j; i++) { 23 if(scores[i] > scores[i+1]) { 24 //只要发生了交换,标志位置为true,表示还需进行下一次比较 25 hasChanged = true; 26 temp = scores[i]; 27 scores[i] = scores[i+1]; 28 scores[i+1] = temp; 29 } 30 } 31 counter++; 32 if(!hasChanged){ 33 break; 34 } 35 } 36 37 38 //排序后 打印数组 39 System.out.println("\n==============排序后===================="); 40 for(int score : scores) { 41 System.out.print(score + " "); 42 } 43 44 System.out.println("\n======================================"); 45 System.out.println("共进行了" + counter + "次比较"); 46 } 47 } 48 49 2.方法的重载 50 一个类中可以存在 [方法名相同、功能相同、参数不同(形参类型、形参数量)的 多个方法]。 这叫方法的重载。 51 如: 52 Arrays.sort(int[] arr); 53 Arrays.sort(float[] arr); 54 Arrays.sort(byte[] arr); 55 Arrays.sort(double[] arr); 56 ... 57 顺便学习了Arrays类的使用,以及API文档的查阅 58 import java.util.Arrays; 59 60 public class TestArraysClass { 61 public static void main(String[] args) { 62 //声明并定义一个无序的数组 63 int[] scores = new int[15]; 64 for(int i = 0; i < scores.length; i++) { 65 scores[i] = (int)(Math.random() * 101); 66 } 67 68 //输出数组 69 System.out.println(Arrays.toString(scores)); 70 71 //将数组排序 72 Arrays.sort(scores); 73 74 //输出数组 75 System.out.println(Arrays.toString(scores)); 76 77 //查询某个元素 78 System.out.println(Arrays.binarySearch(scores,4)); 79 80 //复制一个数组 81 int[] newScores = Arrays.copyOf(scores,0); 82 83 //打印新数组 84 System.out.println(Arrays.toString(newScores)); 85 86 } 87 }
3.可变参数
1)格式:
方法头(类型 ... 参数变量名) {
方法实体
}
2)特点:(要背)
a.只能作为方法的形参;
b.JDK1.5之后提供;
c.可接受八种基本数据类型和数组类型数据;
d.可以接受0个、1个和多个实参;
e.可变参数只能是最后一个参数;
f.定义了可变参数的方法后,不可定义数组为形参的方法;
g.重载的方法包括可变参数 和 确定数量参数的方法时,会优先调用确定数量参数的方法,而
忽略可变参数的方法。
4.main方法如何接收实参?
格式:
java 类名 参数1 参数2 参数3...
5.二维数组
1) 声明格式:
类型[][] 数组名; 或
类型 数组名[][];
2) 分配空间:
new 类型[长度][长度]; ---将二维数组的第一维和第二维都分配空间,使这都有默认值。
或
new 类型[长度][];---仅给二维数组的第一维分配空间,其默认值为null;
3) 动态初始化
数组名[][] = ...;
4) 静态初始化
是将上述三步合而为一。
类型[][] 数组名 = new 类型[][]{{},{},{}...};
或
类型[][] 数组名 = {{},{},{}...};
1 public class TwoDArray{ 2 3 public static void main(String[] args) { 4 5 //int[][] scores = new int[][]{{80,90,78},{90,80},{0,70}}; 6 int[][] scores = {{80,90,78},{90,80},{0,70}}; 7 8 /*scores[0] = new int[4]; 9 scores[1] = new int[3]; 10 scores[2] = new int[2]; 11 12 scores[0][0] = 80; 13 scores[0][1] = 79; 14 scores[0][2] = 78; 15 16 scores[1][0] = 90; 17 scores[1][1] = 80; 18 19 scores[2][1] = 70; */ 20 21 for(int i = 0; i < scores.length; i++) { 22 for(int j = 0; j < scores[i].length; j++) { 23 System.out.print(scores[i][j] + " "); 24 } 25 System.out.println(); 26 } 27 28 } 29 30 }