- 一、冒泡排序原理
- 二、冒泡排序实现
- 三、认识Arrays类
- 四、Arrays类的应用
- 五、认识二维数组
- 六、使用二维数组
一、冒泡排序原理
案例:将5个人从矮到高排队(小绿、小红、小黄、小蓝、小黑)
原理:从前往后,依次两两比较,前者比后者大就交换位置,否则不交换
第一轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小黄比,小红比小黄矮,符合排队规则,不交换位置
第三步:小黄与小蓝比,小黄比小蓝高,不符合排队规则,两个交换位置
第四步:小黄与小黑比,小黄比小黑高,不符合排队规则,两个交换位置
至此,第一轮遍历结束,共比较四次,最大的小黄冒出水面;因此第二轮比较小黄就不参与排队了
第二轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小蓝比,小红比小蓝矮,符合排队规则,不交换位置
第三步:小蓝与小黑比,小蓝比小黑高,不符合排队规则,两个交换位置
至此,第二轮遍历结束,共比较三次,最大的小蓝也冒出水面了,不参与下一轮的比较
第三轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小黑比,小红比小黑高,不符合排队规则,交换位置
至此,第三轮遍历结束,共比较两次,最大的小红也冒出水面了,不参与下一轮的比较
第四轮:
第一步:小绿与小黑比,小绿比小黑高,不符合排队规则,两个交换位置
至此,所有排序结束,第四轮共比较一次,小绿冒出,顺序排列完成。
每一轮都有一个最大的数冒出,因此形象的称这个算法为冒泡排序;
二、冒泡排序实现
分析:
第一轮:比较4次;
第二轮:比较3次;
第三轮:比较2次;
第四轮:比较1次;
轮数在循环,比较次数也在循环,自然想到双重循环;那么哪个作外层循环?哪个作内层循环呢?想到之前讲到的地球公转与自转的例子,明显轮作外层循环,比较次数作内层循环比较合适;因为一轮要比较多次。
用双重循环将5个数字升序排序:
①5个数字如何存放?用数组存放,数组.length = 5
②控制比较多少轮?外层循环,循环变量i(5个数比较4轮,6个数比较5轮,n个数比较(n-1)轮)
③控制每轮比较多少次?内存循环,循环变量j(i从0开始,i=0,j=4;i=1,j=3…故j = 4 - i,推广到n个数就是j = n-1-i)
④交换数据
public class SortNums{
public static void main(String[] args){
int[] nums = {16,25,9,90,23};
System.out.println("*******冒泡排序前*******");
for(int num : nums){
System.out.print(num + "t");
}
//冒泡排序
for(int i = 0;i < nums.length-1;i++){
for(int j = 0;j < nums.length-1-i;j++){
//比较并交换数字
if(nums[j] > nums[j+1]){ //按升序排列
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
System.out.println("n*******冒泡排序后******");
for(int num : nums){
System.out.print(num + "t");
}
}
}
思考:如何手动输入数据,并进行排序?如何进行降序排列?
import java.util.Scanner;
public class SortNums{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请依次输入五个数字:");
int[] nums = new int[5];
for(int i = 0;i < nums.length;i++){
nums[i] = input.nextInt();
}
System.out.println("*******冒泡排序前*******");
for(int num : nums){
System.out.print(num + "t");
}
//冒泡排序
for(int i = 0;i < nums.length-1;i++){
for(int j = 0;j < nums.length-1-i;j++){
//比较并交换数字
if(nums[j] < nums[j+1]){ //按降序排列
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
System.out.println("n*******冒泡排序后******");
for(int num : nums){
System.out.print(num + "t");
}
}
}
三、认识Arrays类
Arrays使用java.util.Arrays类:
(1)java.util包提供的工具类
(2)Arrays类提供操作数组的方法,如排序、查询
(3)Arrays类的sort()方法:对数组进行升序排列
例1:获取5名学员的成绩,并使用Arrays类对其排序;
import java.util.Arrays;
import java.util.Scanner;
public class SortScoreByArrays{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请依次输入五个数字:");
int[] nums = new int[5];
for(int i = 0;i < nums.length;i++){
nums[i] = input.nextInt();
}
System.out.println("*******Arrays排序前*******");
for(int num : nums){
System.out.print(num + "t");
}
//Arrays排序
Arrays.sort(nums);
System.out.println("n*******Arrays排序后******");
for(int num : nums){
System.out.print(num + "t");
}
}
}
使用Arrays的sort方法只需要一行代码就可以进行排序,但并不是说之前学过的排序算法就没有用,sort方法就是封装了排序算法,所以两者我们都要掌握!
sort方法是对数组升序排列,那如何降序排列呢?很简单,先使用sort方法使数组按升序排好,输出时倒着输出就可以了。
四、Arrays类的应用
1:Arrays类常用方法
接下来通过代码练习上述方法:
import java.util.Arrays;
public class ArraysMethods{
public static void main(String[] args){
//equals(array1,array2)的作用是:比较两个数组是否相等
System.out.println("-------equals(array1,array2)方法--------");
int[] arr1 = {10,50,40,30};
int[] arr2 = {10,50,40,30};
int[] arr3 = {60,50,85};
System.out.println(Arrays.equals(arr1, arr2));
System.out.println(Arrays.equals(arr1, arr3));
//toString(array)的作用是:将一个数组array转换成字符串
System.out.println("--------toString(array)方法-------------");
int[] arr = {10,50,40,30};
System.out.println(Arrays.toString(arr));
//fill(array,val)的作用是:把数组array的所有元素都赋值为val
System.out.println("--------fill(array,val)方法-------------");
int[] arr4 = {10,50,40,30};
Arrays.fill(arr4, 100); //该方法没有返回值
System.out.println(Arrays.toString(arr4));
//copyOf(array,length)的作用是:把数组array复制成一个长度为length的新数组
System.out.println("--------copyOf(array,length)方法--------");
int[] arr5 = {10,50,40,30};
int[] arr6 = Arrays.copyOf(arr5, 4);
System.out.println(Arrays.toString(arr6));
//binarySearch(array,val)的作用是:查询元素值val在数组array中的下标
System.out.println("--------binarySearch(array,val)方法--------");
int[] arr7 = {10,50,40,30};
Arrays.sort(arr7); //先将数组升序排列:10,30,40,50
int index = Arrays.binarySearch(arr7, 40);
System.out.println(index);
}
}
2:Arrays类排列字符
使用Arrays类升序排列一组字符,并查找某个特殊字符在升序后数组中的位置;
import java.util.Arrays;
public class ArraysSortChar {
public static void main(String[] args) {
// 字符排序
char[] chars = new char[] { 'a', 'c', 'u', 'b', 'e', 'p', 'f', 'z' };
System.out.print("原字符序列:");
for (char oldChar : chars) {
System.out.print(oldChar + " ");
}
// 查找特定字符b的位置
Arrays.sort(chars); //按照字符的ASCII进行升序排列
System.out.print("n排序后的字符序列:");
for (char oldChar : chars) {
System.out.print(oldChar + " ");
}
int index = Arrays.binarySearch(chars, 'b');
System.out.println("ne字符b在数组中的位置是:" + index);
}
}
Java中有很多方法,我们不可能都准确的记住他们是如何使用的,当我们需要使用某个方法时,我们可以查找JDK帮助文档,就像小学学语文时遇到不会的字就查字典一样,下面别人分享的JDK帮助文档中文版。
jdk帮助文档:https://blog.csdn.net/qq_40147863/article/details/83051268
五、认识二维数组
为什么要学习多维数组?
有这样一个需求:要求对5个班5名学生的某门课程的成绩进行各种操作,如何实现?
对于一维数组,我们可以对5名同学的成绩进行求和,求平均值等操作,可是现在有五个班,该如何实现呢?有人会想到可以定义一个长度为25的一维数组,可是这样又如何区分每个学生的成绩属于哪个班呢?显然不妥!亦或者可以定义5个长度为5的数组存储数据,这样当然也可以,只是太麻烦,要是有100个班呢?还得定义100个数组,显然也不妥!
我们可以使用二维数组解决这个问题,只需要使用一个数组就可以存储5个班的同学成绩。所谓二维数组就是多个一维数组拼成一个二维数组
<数据类型> [ ][ ] 数组名;或者 <数据类型> 数组名 [ ][ ]
int[][] scores; //定义二维数组 scores = new int[5][50]; //分配内存空间:5个长度为50的一维数组拼成一个二维数组,二维数组长度为5 //或者 int[][] scores = new int[5][50];定义二维数组时,要定义最大维数
int[][] scores = new int[5][]; //正确,二维数组长度为5,每个一维数组长度可以不定义 int[][] scores = new int[][]; //错误,没有定义二维数组的长度
总结:二维数组实际上就是一个以一维数组为元素的一维数组,一维数组元素是数据,而二维数组元素是一维数组;这里我想到了学习c语言的时候,谭浩强老师的教材是将二维数组比作按排按列排队,
比如a[3][5]就是3行5列的方队,其中二维数组长度就是有几排,每一排多少个人就是每一个一维数组的长度。
六、使用二维数组
如何定义并赋值?
写法一:int[ ][ ] scores = new int[ ][ ]{{90,85,92,78,54},{76,63,80},{87}};
写法二:int scores[ ][ ] = {{90,85,92,78,54},{76,63,80},{87}};
例2:5个班各5名学生的某门课程的成绩,如何计算5个班各自的总成绩
import java.util.Scanner;
public class ClassScoreTotal{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int[][] scores = new int[5][5];
//为班级同学成绩赋值
for(int i = 0;i < scores.length;i++){
System.out.println("------第"+(i+1)+"个班-------");
for(int j = 0;j < scores[i].length;j++){
scores[i][j] = input.nextInt();
}
}
//完成5个班级的成绩统计
System.out.println("---------统计成绩----------");
for(int i = 0;i < scores.length;i++){
int sum = 0;
for(int j = 0;j < scores[i].length;j++){
sum += scores[i][j];
}
System.out.println("第"+(i+1)+"个班的同学的总成绩为:"+sum);
}
}
}
二维数组经常结合双重循环使用



