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