数组(二)
一、冒泡
package com.JavaSE.homework.Day13.buble; import java.util.Arrays; public class Bubble { public static void main(String[] args) { int[] arr = {12, 3, 534, 9, 54, 4, 45}; 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]) {//减i可以提高效率,最后的最大值不用参与比较 int dz = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = dz; } } } System.out.println(Arrays.toString(arr)); } }
int[] arr={12,3,534,9,54,4,45};//一个一个前进式比较,像冒泡一样
第一轮: 零和一比较
3 12 534 9 54 4 45
一和二比较
3 12 534 9 54 4 45
二和三比较
3 12 9 534 54 4 45
三和四比较
3 12 9 54 534 4 45
四和五比较
3 12 9 54 4 534 45
五和六比较
3 12 9 54 4 45 534 已经找出最大的,下一轮不用比较最后一个
第二轮:零和一比较
3 12 9 54 4 45
一和二比较
3 9 12 54 4 45
二和三比较
3 9 12 54 4 45
三和四比较
3 9 12 4 54 45
四和五比较
3 9 12 4 45 54 找出第二大
第三轮 找出第三大
第一次:3 9 12 4 45
第二次:3 9 12 4 45
第三次:3 9 4 12 45
第四次:3 9 4 12 45
第四轮 找出第四大
第一次:3 9 4 12
第二次:3 4 9 12
第三次:3 4 9 12
第五轮 找出第五大
第一次:3 4 9
第二次:3 4 9
第六轮 找出第六大
第一次:3 4
剩余的为最小不用再比较
二、选择
package com.JavaSE.homework.Day13.select; import java.util.Arrays; public class Select { public static void main(String[] args) { int[] arr = {12, 3, 534, 9, 54, 4}; for (int i = 0; i < arr.length - 1; i++) { for (int j = i; j < arr.length-1; j++) { if (arr[i] > arr[j+1]) { int dz = arr[i]; arr[i] = arr[j+1]; arr[j+1] = dz; } } } System.out.println(Arrays.toString(arr)); } }
12 3 534 9 54 4//一个和剩下所有比较,换位置是所有数据与本轮次主位来回换(类似打擂台),不像冒泡式逐一前进
第一轮: 零号位与其他位一一比较
零和一比较
3 12 534 9 54 4
零和二比较
3 12 534 9 54 4
零和三比较
3 12 534 9 54 4
零和四比较
3 12 534 9 54 4
零和五比较
3 12 534 9 54 4
第二轮: 一号位与其他后面的位一一比较
一和二比较
12 534 9 54 4
一和三比较
9 534 12 54 4
一和四比较
12 534 9 54 4
一和五比较
4 534 9 54 12
第三轮: 二号位与其他后面的位一一比较
二和三比较
9 534 54 12
二和四比较
9 534 54 12
二和五比较
9 534 54 12
第四轮: 三号位与其他后面的位一一比较
三和四比较
54 534 12
三和五比较
12 534 54
第五轮: 四号位与其他后面的位一一比较
四和五比较
54 534
剩余的534为最大不用再比较
三、二分查
二分查:前提条件是有序的数据
{13,25,37,41,53,68,79}
package com.JavaSE.homework.Day13.BinaryDivide; public class BinaryDivide { public static void main(String[] args) { int[] arr = {13, 25, 37, 41, 53, 68, 79}; int a = 68; int min = 0; int max = arr.length; while (true) { int mm = (max + min) / 2; if (a > arr[mm]) {//大于就把左范围改为中值 min = mm; } else if (a < arr[mm]) { max = mm; } else if (a == arr[mm]) { System.out.println(mm); break; } } } }
四、可变长参数(了解)
package com.JavaSE.homework.Day13.Variable; public class VariablePar { public static void main(String[] args) { fun(1,243,423,42,4,234,234,53456,46); } public static void fun(int a, int... b) { System.out.println(a);//这里的b相当于一个数组,是个对象,不能直接输出 for (int b1 : b) { System.out.println(b1); } } }
说明:
1)在参数类型与参数名中间使用 ... 三个小点表示它是可变长参数
2)可变长参数可以接收任意个数据
3)一个方法最多只能 有一个变长参数
4)变长参数只能放在参数列表的最后
5)在方法体中,可以简单的把变长参数当作数组使用
如定义方法,计算任意个整数的和:
练习:
提供一个函数:把数组中所有元素以字符串形式输出输出
{1,243,423,42,4,53456,46}
字符串输出
" {1,243,423,42,4,53456,46} "
自定义数组的工具类:里面都是静态方法
package com.JavaSE.homework.Day13.Arrays; public class TestArrays { public static void main(String[] args) { int[] arr = {1, 243, 423, 42, 4, 53456, 46}; Arrays.print(arr); } } package com.JavaSE.homework.Day13.Arrays; public class Arrays { public static void print(int[] arr) { System.out.print("{"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ", "); if (i >= arr.length - 1) { System.out.print(arr[i]); System.out.print("}"); return; } } } }
五、工具类Arrays
java.util.Arrays类,提供对数组的一些操作
package com.JavaSE.homework.Day13.Arrays1; import java.util.Arrays; import java.util.Random; public class Test { public static void main(String[] args) { int[] arr = {1, 243, 423, 42, 4, 53456, 46, 46}; int[][] arrTwo = {{1, 2}, {4, 7}}; //toString System.out.println(Arrays.toString(arr)); //deepToString 可以输出多维数组 System.out.println(Arrays.deepToString(arrTwo)); //排序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); //大量排序 Random rd=new Random(); int arrP[] = new int[1000]; for (int i = 0; i < 1000; i++) { arrP[i] = rd.nextInt(100); } Arrays.parallelSort(arrP); System.out.println(Arrays.toString(arr)); //扩容 这里是在产生了新的数组,所以必须赋值,不能在原有基础上修改 int[] arr1= Arrays.copyOf(arr, arr.length*2); System.out.println(Arrays.toString(arr1)); //拷贝 int[] arr2=Arrays.copyOfRange(arr1, 3,7); System.out.println(Arrays.toString(arr2)); //fill 替换 // Arrays.fill(arr, 3, 7, 24);//从3到7替换为24 // System.out.println(Arrays.toString(arr)); // Arrays.fill(arr, 3); } }
六、对象数组
数组存储批量数据,可以存储基本数据类型,也可以存储引用数据类型
Student类 创建对象 s1 s2 s3。。。
创建一个数组把对象存储进去
应用:
一个学生对应一个班级----------1对1 one to one
一个班级有很多学生-------------1对多 one to more
练习:双色球
1到33球,选6个红色球(不重复的)放入一个数组中
创建一个数组 放入1到33个球,使用随机数,随机选择6个,不能重复
1到16个蓝色球,选一个
蓝色球是可以跟红色球重复
模拟机选双色球一注
package com.JavaSE.homework.Day13.DoubleColBall; import java.util.Arrays; import java.util.Random; public class DaCoBall { public static void main(String[] args) { Random rb = new Random(); int[] arrRb = new int[6]; int lb = rb.nextInt(16) + 1; for (int i = 0; i < arrRb.length; ) {//循环6次 挨个赋值 boolean flag = true;//!!!!!!!!!!!!!!!!!!不能写外面 写外面也得每次重置为true 不然一旦false会死循环 int rb1 = rb.nextInt(33) + 1; for (int j = 0; j < arrRb.length; j++) {//循环数组 无重复再赋值 if (rb1 == arrRb[j]) { flag = false; break; } } if (flag) { arrRb[i] = rb1; i++; } } Arrays.sort(arrRb); System.out.println(Arrays.toString(arrRb) + " + " + lb); } }

浙公网安备 33010602011771号