排序与二维数组

一、排序

排序基础

//排序基础:交换两个变量的值
int a = 1;
int b = 2;
int t = a;   //t=1
	a = b;   //a=2
	b = t;   //b=1
System.out.println("a="+a+";b="+b);

冒泡排序

//冒泡排序:相邻元素两两比较;大的放右边,比较完一轮则确定最右边的数最大;
//以此类推,共比较(长度-1)轮
//分析:1.画图分析排序规则    2.编写代码分析规律
int[] a = {8,7,6,5,4,3,2,1};
for(int i=0;i<a.length-1;i++) { //外层确定轮(行)数
    for(int j=0;j<a.length-1-i;j++) { //内层确定每轮比较的次数(冒泡-次数递减)
        if(a[j]>a[j+1]) { //相邻两数的比较
            int t = a[j];
            a[j]  = a[j+1];
            a[j+1]  = t;
        }
    }
    System.out.println("第"+(i+1)+"轮:"+Arrays.toString(a));
}

选择排序

//选择排序:假设第一个为最小,依次与后面元素比较;
//小的放左边;比较完一轮,最左边的为最小;依次类推,共比较(长度-1)轮
int[] a = {3,1,5,2};
for(int i=0;i<a.length-1;i++) {//外层比较轮数
    for(int j=i+1;j<a.length;j++) { //内层确定次数
        if(a[i]>a[j]) {//每次的比较都是a[i]和后面的比
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    System.out.println("第"+(i+1)+"轮:"+Arrays.toString(a)); //每轮的打印
}

插入排序

//扩展了解插入排序:
//第一轮先比较前两个元素;第二轮插入一个元素与第一轮最大的比;
//如果比最大的还要大,直接排下来;否则再和前面的比,以此类推,共比较(长度-1)轮
int[] a = {3,1,5,2,8,4,7,6};
for(int i=0;i<a.length-1;i++) { //比较轮数
    for(int j=i+1;j>0;j--) { //倒着进行比较
        if(a[j]<a[j-1]){ //如果后一个比前一个小,则交换
            int t = a[j];
            a[j] = a[j-1];
            a[j-1]= t; 
        }else { //如果插入的元素,比排好序最大的还要大则退出内层循环
            break;
        }
    }
    System.out.println(Arrays.toString(a));
}

系统提供的排序

class MyArrays{
	public static void sort(int[] a) {
		//冒泡:
		for(int i=0;i<a.length-1;i++) {
			for(int j=0;j<a.length-1-i;j++) {
				if(a[j]>a[j+1]){
					int t = a[j];
					a[j] = a[j+1];
					a[j+1] = t;
				}
			}
		}
	}
}
public class Test5 {
	public static void main(String[] args) {
		//系统提供的排序的函数:Arrays.sort
		int[] a = {1,3,5,2};
		//Arrays.sort(a); //数组排序-系统提供
		MyArrays.sort(a); //自定义排序方法
		System.out.println("排序后:"+Arrays.toString(a));
	}
}

二、数组应用

学员管理系统

/*
    创建一个数组,用于存储全班的姓名,需要从控制台输入标记:1,添加  2.查询
    存储元素时,要判断数组中是否有重名(如果有,则不用存储,提示已存在);查询时,打印存储元素的数据
    提示:判断元素为null,则存储--if(a[i]==null)  
         判断元素重名了,则不存储--if(a[i].equals(name)),引用类型判断相等用equals

    请输入你的操作标记:1,添加  2.查询
    1
    请添加学员姓名: zs
    添加成功
    请输入你的操作标记:1,添加  2.查询
    1
    请添加学员姓名: zs
    已存在,请重新输入
    请输入你的操作标记:1,添加  2.查询
    2
    zs
*/
public static void main(String[] args) {
    //案例:学员管理系统:1.添加,2.查询功能,3.退出
    //分析:dowhile循环,switch,存储数据,判断是否存在;查询-循环遍历
    String[] names = new String[50];  //动态赋值--全是null
    do {
        System.out.println("请输入你的操作标记:1.添加,2.查询,3.退出");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        switch(num) {
            case 1:
                System.out.print("请添加学员姓名:");
                String name = sc.next();
                add(names,name);  //添加功能
                break;
            case 2:
                query(names);    //查询功能
                break;
            case 3:
                System.out.println("退出");
                return;
        }
    }while(true);
}

private static void query(String[] names) { //查询功能
    for(int i=0;i<names.length;i++) {//循环50次
        if(names[i]==null) {
            return;
        }
        System.out.println(names[i]);
    }
}

private static void add(String[] names, String name) { //添加功能
    for(int i=0;i<names.length;i++) {
        //注意:String为null不能调方法,否则报错
        if(names[i]==null) { //为null,则直接存储;判断null可以使用==
            names[i]=name;
            System.out.println("添加成功~!");
            return;
        }
        if(names[i].equals(name)) {//判断名字在数组中是否存在,注意引用类型不要用==
            System.out.println("该姓名已存在!!!");
            return;
        }
    }
}

三、二维基础

概述:一维数组的一维数组,也就是可以看成一维数组的元素又是一维数组

二维数组的定义,可以看成是行长度和列长度的空间定义

在操作时,可看成是行下标和列下标的操作;行下标范围:0~行长度-1 列下标访问:0~列长度-1

基本操作

基本操作包括定义二维数组,赋值,取值,循环遍历

//定义一个整数类型的二维数组
//和一维数组类似,创建空间,有默认值:int-0 String-null double-0.0,,,
int[][] a = new int[2][3];  //创建2行3列的二维数组空间---默认值为0
a[0][0] = 60;
a[0][1] = 30;
a[1][0] = 50;
//a[2][0] = 40; //下标越界-行下标越界
//a[0][3] = 90; //下标越界-列下标越界

System.out.println("行长度:"+a.length);
System.out.println("列长度:"+a[0].length);

for(int i=0;i<a.length;i++) {  //外层代表行
    for(int j=0;j<a[i].length;j++) { //内层代表列
        System.out.print(a[i][j]+"   ");
    }
    System.out.println();  //回车
}

创建方式

//二维数组创建方式:
//--------动态赋值----------
int[][] a;
a = new int[2][3];  //1.先声明,再创建空间

int[][] b = new int[2][3]; //2.声明的同时创建空间

int[][] c = new int[2][];  //3.先创建行空间,再创建列空间
c[0] = new int[]{1,3,5};
c[1] = new int[]{2,4,6};

//--------静态赋值----------
int[][] d = {{1,3,5},{2,4,6}}; //2行3列的二维数组

四、扩展应用

不规则列

二维数组中,行是固定的,但是列可以不规则;不规则列相对用得特别少,因为赋值和取值较麻烦,可读性也会更差

//不规则列的二维数组:
//1.先创建行空间的方式
/*
	int[][] a = new int[2][]; //确定行长度
	a[0]=new int[]{1,3};  //第一行2列
	a[1]=new int[]{2,4,6}; //第二行3列
*/

//2.静态赋值的方式
int[][] a = {{1,2},{3,5,9}};
//a[0][2] = 5;  //下标越界

//循环遍历取值:
for(int i=0;i<a.length;i++) {
    for(int j=0;j<a[i].length;j++) {
        System.out.print(a[i][j]+" ");
    }
    System.out.println();  //回车
}

杨辉三角

public static void main(String[] args) {
    //杨辉三角:
    /*
		 *   1
		 *   1  1
		 *   1  2  1
		 *   1  3  3   1
		 *   1  4  6   4   1
		 *   1  5  10  10  5  1  
		 * 
		 * 规则:行和列结构
		 * 第1列都为1,行列相等位置为1;
		 * 其余的当前位置=上一个+上一个左侧 
		 * 
		 * */
    System.out.println("请输入杨辉三角的长度:");
    Scanner sc = new Scanner(System.in);
    int length = sc.nextInt();
    int[][] a = new int[length][length];  //初始都为0
    yangHui(a);  //杨辉三角的赋值
    print(a);    //打印
}

private static void print(int[][] a) {
    for(int i=0;i<a.length;i++) {
        for(int j=0;j<=i;j++) {
            System.out.print(a[i][j]+" ");
        }
        System.out.println();  //回车
    }
}

private static void yangHui(int[][] a) {
    for(int i=0;i<a.length;i++) {
        for(int j=0;j<=i;j++) { //直角三角形的循环次数
            if(j==0||i==j) {//第1列和i,j相等,则为1
                a[i][j]=1;
            }else {
                //当前位置=上一个+上一个左边
                a[i][j]=a[i-1][j]+a[i-1][j-1];
            }
        }
    }

}

五、总结与作业

总结

1.排序(重点)
排序基础、冒泡,选择,插入(扩展了解)等排序方法;系统提供的排序,自定义排序
理解排序规则:a,画图分析   b,代码实现
2.数组应用
学员管理系统(重点):String-equals,null用==
3.二维基础
基本操作:数组定义,下标操作,循环遍历(重点)
创建方式
4.扩展应用
不规则列二维数组(了解),杨辉三角

作业

1、使用double类型可变长参数,接收实参变量,并进行打印
2、数组的排序,创建长度为5的数组,并循环输入值,再进行排序:
          1. 冒泡排序
          2. 选择排序
          3. Arrays.sort 3种方式。
3、使用二维数组,保存3个班,每个班5人的成绩,并进行输出

扩展应用:(可选)
4.将学员管理系统的删除和修改完成;
提示:
删除:匹配删除学员,找到下标后,进行循环;后一个赋值给前一个,实现删除功能
修改:找到修改位置,将新值替换旧值;注意,需要判断新值再数组中不存在