排序与二维数组

1、排序前提

无论使用那些规则的排序,都需要两个元素的值的交换。

//案例: 交换两个变量的值
public class Swap {
	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		
		//借一个变量,实现两个变量值的交换
		int t = a; //t=1  规则:左边看成变量,右边看成值
		    a = b; //a=2
		    b = t; //b=1
		
		System.out.println(a);  //2
		System.out.println(b);  //1
	}
}

2、排序

2.1 冒泡排序

冒泡排序:相邻两数两两相比较,大的放右边;比较完一轮,确定最右边的最大;依次类推,共比较(n-1轮)

//分析: 1.画图理解比较规则   2.代码实现
public class Sort1 {
	public static void main(String[] args) {
		int[] a = {3,1,5,2,9,6,4,7};
		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));
		}
	}
}

2.2 选择排序

选择排序:假设第一个元素为最小,依次与后面的元素比较;比较完一轮确定第一个位置元素最小;假设第二个元素为最小,依次与后面比较;依次类推,共比较(n-1)轮

public class Sort2 {
	public static void main(String[] args) {
		int[] a = {3,1,5,2,9,6,4,7};
		for(int i=0;i<a.length-1;i++) {
			for(int j=i+1;j<a.length;j++) {
				if(a[i]>a[j]) {
					int t = a[i];
					a[i] = a[j];
					a[j] = t;
				}
			}
			System.out.println("第"+(i+1)+"轮:"+Arrays.toString(a));
		}
		
	}
}

2.3 插入排序

插入排序:第一轮,比较前两个元素,大的放右边;第二轮,插入第三个元素,与排好序的最大值比较;如果比最大值还要大,确定好第三个元素的位置;如果比最大值小,则交换,继续与前面的比较,依次类推,共比较(n-1)轮

public class Sort3 {
	public static void main(String[] args) {
		int[] a = {3,1,5,2,9,6,4,7};
		for(int i=0;i<a.length-1;i++) { //外层代表轮数
			for(int j=i;j>=0;j--) {//每轮比较的次数
				if(a[j+1]<a[j]) {
					int t = a[j+1];
					a[j+1]=a[j];
					a[j]  = t;
				}else {
					break;//如果插入的数,比排好序的最大值还要大,则跳出该轮循环
				}
			}
			System.out.println("第"+(i+1)+"轮:"+Arrays.toString(a));
		}
	}
}

2.4系统提供的排序方式

public class Sort4 {
	public static void main(String[] args) {
		int[] a = {3,1,5,2};
		//Arrays.sort(a);  //调用系统的排序方法
		
		sort(a); //自定义排序方法
		System.out.println(Arrays.toString(a));
	}

	private 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;
				}
			}
		}
		
	}
}

3、二维数组

3.1 二维数组的赋值

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

public class TwoArray {
	public static void main(String[] args) {
		//二维数组的定义:看成行和列的设计结构
		//数据类型[][] 数组名 = new int[行长度][列长度];
		int[][] a = new int[2][3];
		//赋值: 通过行下标和列下标操作,行下标范围:行长度-1,列下标范围:列长度-1
		a[0][0]=3;
		a[0][1]=5;
		//没有赋值的元素,int类型默认为0,String类型默认为null
		System.out.println(a[0][0]+" "+a[0][1]+" "+a[0][2]);
		System.out.println(a[1][0]+" "+a[1][1]+" "+a[1][2]);
		//System.out.println(a[0][3]);  //列下标越界
		//System.out.println(a[3][0]); //行下标越界
	}
}

3.2二维数组的遍历

public class TwoArray2 {
	public static void main(String[] args) {
		//二维数组的定义:看成行和列的设计结构
		//数据类型[][] 数组名 = new int[行长度][列长度];
		int[][] a = new int[2][3];
		a[0][0]=3;
		a[0][1]=5;
		
		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();  //换行
		}
		
	}
}

3.3 二维数组的创建方式

public class TwoArray3 {
	public static void main(String[] args) {
		//---动态赋值---
		//方式1:先声明,再创建空间
		int[][] a;
		a = new int[2][3];
		
		//方式2:声明的同时,创建空间(常用)
		int[][] b = new int[3][4];
		
		//方式3: 先创建行空间,赋值时再创建列空间
		int[][] c = new int[2][];
		c[0]=new int[]{1,5,6}; //赋值时,创建列空间
		c[1]=new int[]{2,3,4};
		
		//---静态赋值---
		//方式4:创建空间的同时赋值  (常用)
		int[][] d = {{1,2,3},{4,5,6}};
	}
}

3.4 列不规则的二维数组

public class TwoArray4 {
	public static void main(String[] args) {
		/*
		int[][] a = new int[2][];
		a[0] = new int[] {2,6};
		a[1] = new int[] {3,7,8};  //列不规则
		*/
		
		//列不规则的二维数组方式2:静态赋值
		int[][] a = {{1,3},{2,4,6}};
		
		//循环遍历
		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(); //换行
		}
	}
}

4. 综合练习

4.1杨辉三角


 *   1
 *   1 1
 *   1 2 1
 *   1 3 3 1 
 *   1 4 6 4 1 
 *   1 5 10 10 5 1
 *   ...
  分析: 直角三角形  第一列为1 i和j相等的位置为1; 
  其余的,当前位置的值,等于上一个+上一个左侧的值
  循环嵌套,二维数组(存值+遍历) 

public class Exec1 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入杨辉三角的行数:");
		int num = scanner.nextInt();
		int[][] a = new int[num][num];
		for(int i=0;i<num;i++) {
			for(int j=0;j<=i;j++){
				if(j==0||j==i) {  //第一列为1 i和j相等的位置为1
					a[i][j]=1;
				}else{ //等于上一个+上一个左侧的值
					a[i][j]=a[i-1][j]+a[i-1][j-1];
				}
				
				System.out.print(a[i][j]+" ");
			}
			System.out.println();  //回车
		}
	}
}

4.2 数组的学员管理系统

//案例: 通过数组完成学员管理系统(增删改查操作-CRUD)
/*
   请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出
1
    请输入你要添加的学生姓名:zs
    添加成功
    请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出
1
    请输入你要添加的学生姓名:zs
    学员已存在
2
ls,ww,zl,zs
  请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出       
3
   请输入你要删除的学员姓名:wb
    删除的学员不存在      
    请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出       
3
   请输入你要删除的学员姓名:ls
    删除成功   
   请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出       
4
   请输入要修改的学生姓名:zs--在数组中要存在
   请输入修改成的学生姓名:wb--在数组中不存在               
*/
//分析:死循环+switch等值判断+字符串数组存姓名
//1.添加:判断是否已存在---数组默认值为null

public class Exec2 {
	//注意:把创建空间f
	static String[] sts = new String[90];  //定义存90个同学的姓名
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		do {
			System.out.println("请输入你的操作: 1.添加  2.查询  3.删除  4.修改  5.退出");
			int num = scanner.nextInt();
			switch (num) {
			case 1:
				System.out.print("请输入要添加的姓名:");
				String name = scanner.next();
				add(name);  //添加
				break;
			case 2:
				query(); //查询数组的所有元素
				break;
			case 3:
				System.out.print("请输入你要删除的学员姓名:");
				name = scanner.next();
				delete(name);  //删除
			case 4:
				System.out.print("请输入要修改的学生姓名:");
				String oldName = scanner.next();
				System.out.print("请输入修改成的学生姓名:");
				String newName = scanner.next();
				update(oldName,newName);  //修改
			case 5:
				System.out.println("退出");
				return;
			default:
				System.out.println("输入有误,请重新输入");
				break;
			}
		}while(true);
	}

	private static void update(String oldName, String newName) {
		int index = panDuan(oldName);  //判断
		if(index==-1) {
			System.out.println("要修改的姓名不存在");
		}else {
			int i = panDuan(newName);  //判断
			if(i!=-1) {
				System.out.println("修改成的姓名已存在");
			}else {
				sts[index]=newName;  //修改元素值
				System.out.println("修改成功!");
			}
		}
		
	}

	//删除指定的姓名
    private static void delete(String name) {
		int index = panDuan(name);
		if(index==-1) {
			System.out.println("删除的姓名不存在");
		}else{
			for(int i=index;i<sts.length-1;i++){
				if(sts[i]==null) {
					break;   //如果元素为null,则不要再赋值了
				}
				sts[i]=sts[i+1];
			}
			System.out.println("删除成功!");
		}
		
	}

	//查询所有元素
	private static void query() {
		for(int i=0;i<sts.length;i++) {
			if(sts[i]==null) { //String类型,只有判断null,才用'=='
				break;
			}
			System.out.print(sts[i]+" ");
		}
		System.out.println();  //换行
	}

	//添加功能
	private static void add(String name) {
		//判断名字是否以存在,存在则不添加,不存在,才添加
		int index = panDuan(name);  //返回结果为下标,如果不能存在则约定为-1
		if(index!=-1){ //存在,找到了下标
			System.out.println("该用户已存在,不能添加");
		}else{
			for(int i=0;i<sts.length;i++) { //注意:存的值肯定是连续的
				if(sts[i]==null) {
					sts[i]=name;
					break;
				}
			}
			System.out.println("添加成功!");
		}
		
	}

	//判断是否存在姓名,返回值为下标,不存在则返回-1
	private static int panDuan(String name) {
		for(int i=0;i<sts.length;i++) {
			if(sts[i]==null) { //如果出现了null,说明不存在该用户
				return -1;
			}
			//注意:String类型不能用'=='判断内容相等,需使用String.equals()
			if(name.equals(sts[i])){ 
				return i;
			}
		}
		return -1;
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值