文章目录
6 数组
本章需要注意的知识:
- 判断字符串相等的方法
findName.equals(names[i]))
2.数组交换的是地址,和一般的常量交换有所不同 - List item
6.10 冒泡排序法
- 冒泡排序(Bubble Sorting)的基本思想是:
通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
- 下面我们举一个具体的案例来说明冒泡法。我们将五个无序:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列。
public class BubbleSort {
//编写一个 main 方法
public static void main(String[] args) {
//老韩 化繁为简,先死后活
//
/*
冒泡排序法::
几轮排序:元素个数-1
数组 [24,69,80,57,13]
第 1 轮排序: 目标把最大数放在最后
第 1 次比较[24,69,80,57,13]
第 2 次比较[24,69,80,57,13]
第 3 次比较[24,69,57,80,13]
第 4 次比较[24,69,57,13,80]
*/
int[] arr = {24, 69, 80, 57, 13, -1, 30, 200, -110};
int temp = 0; //用于辅助交换的变量
//将多轮排序使用外层循环包括起来即可
//先死后活 =》 4 就是 arr.length - 1
for( int i = 0; i < arr.length - 1; i++) {//外层循环是 4 次
for( int j = 0; j < arr.length - i -1; j++) {//4 次比较-3 次-2 次-1 次
//如果前面的数>后面的数,就交换
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("\n==第"+(i+1)+"轮==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
}
// for( int j = 0; j < 4; j++) {//4 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("==第 1 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// /*
// 第 2 轮排序: 目标把第二大数放在倒数第二位置
// 第 1 次比较[24,69,57,13,80]
// 第 2 次比较[24,57,69,13,80]
// 第 3 次比较[24,57,13,69,80]
// */
// for( int j = 0; j < 3; j++) {//3 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 2 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// 第 3 轮排序: 目标把第 3 大数放在倒数第 3 位置
// 第 1 次比较[24,57,13,69,80]
// 第 2 次比较[24,13,57,69,80]
// for( int j = 0; j < 2; j++) {//2 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 3 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
// /*
// 第 4 轮排序: 目标把第 4 大数放在倒数第 4 位置
// 第 1 次比较[13,24,57,69,80]
// */
// for( int j = 0; j < 1; j++) {//1 次比较
// //如果前面的数>后面的数,就交换
// if(arr[j] > arr[j + 1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// System.out.println("\n==第 4 轮==");
// for(int j = 0; j < arr.length; j++) {
// System.out.print(arr[j] + "\t");
// }
}
}
6.11 查找
6.11.1 介绍:
在 java 中,我们常用的查找有两种:
1) 顺序查找 SeqSearch.java
2) 二分查找【二分法,我们放在算法讲解】
6.12 案例演示:
- 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
要求: 如果找到了,就提示找到,并给出下标值。
import java.util.Scanner;
public class SeqSearch {
//编写一个 main 方法
public static void main(String[] args) {
/*
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
要求: 如果找到了,就提示找到,并给出下标值
思路分析
1. 定义一个字符串数组
2. 接收用户输入, 遍历数组,逐一比较,如果有,则提示信息,并退出
*/
//定义一个字符串数组
String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String findName = myScanner.next();
//遍历数组,逐一比较,如果有,则提示信息,并退出
//这里老师给大家一个编程思想/技巧, 一个经典的方法
int index = -1;
for(int i = 0; i < names.length; i++) {
//比较 字符串比较 equals, 如果要找到名字就是当前元素
if(findName.equals(names[i])) { //这里是判断字符串相等的方法
System.out.println("恭喜你找到 " + findName);
System.out.println("下标为= " + i);
//把 i 保存到 index
index = i;
break;//退出
}
}
if(index == -1) { //没有找到
System.out.println("sorry ,没有找到 " + findName);
}
}
}
- 请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,
如果没有就提示"没有这个数"。
//暂无代码
6.13 多维数组
多维数组我们只介绍二维数组。
二维数组的应用场景
比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。如图:
6.14 二维数组的使用
6.14.1 二维数组快速入门案例
请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0
public class TwoDimensionalArray01 {
//编写一个 main 方法
public static void main(String[] args) {
/*
请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0
*/
//什么是二维数组:
//老韩解读
//1. 从定义形式上看 int[][]
//2. 可以这样理解,原来的一维数组的每个元素是一维数组, 就构成二维数组
int[][] arr = { {0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0},
{0,2, 0, 3, 0, 0},
{0, 0, 0, 0, 0, 0} };
//关于二维数组的关键概念
//(1)
System.out.println("二维数组的元素个数=" + arr.length);
//(2) 二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值
// 还需要再次遍历
//(3) 如果我们要访问第 (i+1)个一维数组的第 j+1 个值 arr[i][j];
// 举例 访问 3, =》 他是第 3 个一维数组的第 4 个值 arr[2][3]
System.out.println("第 3 个一维数组的第 4 个值=" + arr[2][3]); //3
//输出二维图形
for(int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
//遍历二维数组的每个元素(数组)
//老韩解读
//1. arr[i] 表示 二维数组的第 i+1 个元素 比如 arr[0]:二维数组的第一个元素
//2. arr[i].length 得到 对应的 每个一维数组的长度
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " "); //输出了一维数组
}
System.out.println();//换行
}
}
}
-二维数组的初始化有两种:
- 动态初始化
其中动态初始化有三种表现形式
- 静态初始化
6.14.2 二维数组的动态初始化(1)
动态初始化的第一种表现形式
TwoDimensionalArray02.java
1) 语法: 类型[][] 数组名= new 类型[大小][大小]
2) 比如: int a[][]=new int[2][3
代码展示
public class TwoDimensionalArray02 {
//编写一个 main 方法
public static void main(String[] args) {
//int arr[][] = new int[2][3];
int arr[][]; //声明二维数组
arr = new int[2][3];//再开空间
arr[1][1] = 8;
//遍历 arr 数组
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {//对每个一维数组遍历
System.out.print(arr[i][j] +" ");
}
System.out.println();//换行
}
}
}
二维数组在内存中的存在形式
6.14.3 二维数组的动态初始化(2)
先声明:类型 数组名[][];
再定义(开辟空间) :数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0
6.14.4 二维数组的动态初始化(3)列数不确定
public class TwoDimensionalArray03 {
//编写一个 main 方法
public static void main(String[] args) {
/*
看一个需求:动态创建下面二维数组,并输出
i = 0: 1
i = 1: 2 2
i = 2: 3 3 3
一个有三个一维数组, 每个一维数组的元素是不一样的
*/
//创建 二维数组,一个有 3 个一维数组,但是每个一维数组还没有开数据空间
int[][] arr = new int[3][];
for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
//给每个一维数组开空间 new
//如果没有给一维数组 new ,那么 arr[i]就是 null
arr[i] = new int[i + 1];
//遍历一维数组,并给一维数组的每个元素赋值
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = i + 1;//赋值
}
}
System.out.println("=====arr 元素=====");
//遍历 arr 输出
for(int i = 0; i < arr.length; i++) {
//输出 arr 的每个一维数组
for(int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();//换行
}
}
}
6.14.5 二维数组的静态初始化
定义 :
类型 数组名[][] = {{值 1,值 2..},{值 1,值 2..},{值 1,值 2..}}
使用即可 [ 固定方式访问 ]
比如:
int[][] arr = {{1,1,1}, {8,8,9}, {100}};
解读
1. 定义了一个二维数组 arr
2. 2. arr 有三个元素(每个元素都是一维数组)
3. 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素
6.14.6 静态初始化案例
int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和
比较简单,暂无代码
6.15 二维数组的应用案例 -杨辉三角
- 使用二维数组打印一个 10 行杨辉三角 YangHui.java
public class YangHui {
public static void main(String[] args) {
// 使用二维数组打印一个 10 行杨辉三角
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 1 5 10 10 5 1
// 规律
// 1.第一行有 1 个元素, 第 n 行有 n 个元素
// 2. 每一行的第一个元素和最后一个元素都是 1
// 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值. arr[i][j]
int [][] Yanghui = new int[10][];
for(int i = 0; i < Yanghui.length; i ++ ){//这里是第一个技巧:i < Yanghui.length;
Yanghui[i] = new int[i + 1];
for(int j = 0;j < Yanghui[i].length; j++){
if(j == 0 || j == Yanghui[i].length - 1 ){ //这里是第二个技巧:j == arr.length - 1 ,特别注意这里是||符号
Yanghui[i][j] = 1;
}else{
Yanghui[i][j] = Yanghui[i-1][j-1] + Yanghui[i-1][j];
}
}
}
System.out.println("=====遍历输出=====");
for(int i = 0; i < Yanghui.length; i++ ){
for(int j = 0; j < Yanghui[i].length;j++ ){
System.out.print(Yanghui[i][j] + "\t");
}
//换行
System.out.println();
}
}
}
6.16 二维数组使用细节和注意事项
- (1)一维数组的声明方式有:
int[] x 或者 int x[] - (2) 二维数组的声明方式有:
int[][] y 或者 int[] y[] 者 或者 int y[][] - (3) 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。
比如:
map[][] 是一个二维数组 int map [][] = {{1,2},{3,4,5}}
map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组
6.17 二维数组课堂练习
6.18 本章作业
** 分析示意图 **
- 相关代码
import java.util.Scanner;
public class work04 {
public static void main(String[] args) {
/*
/已知有个升序数组,要求插入一个数之后,仍然是升序数组。
// 给定数组:{10,12,45,90},要求在该数组中插入一个数23,插入后的数组仍然是升序。
思路:
静态初始化数组,
1. 先定位插入到哪里
2.扩容便利,如果到了这个位置,就插入,如果不是这个位置,就接着遍历
*/
int arr[] = {10,12,45,90};
Scanner myscanner = new Scanner(System.in);
System.out.println("请输入需要插入的数字:");
int InsertNum = myscanner.nextInt();
// System.out.println("=========1.定位============");
int inde = -2;
for(int i = 0;i < arr.length;i++){ // 定位
System.out.print( arr[i]+ "\t");
if(InsertNum <= arr[i]){
inde = i;
break;// 一旦找到满足条件的就break循环,才能保证后面不出错。
}
}
// System.out.println("=========2.扩容插入============");
int arr2[] = new int[arr.length + 1];
for (int j = 0, k = 0; j < arr2.length; j++) {//扩容
if (j != inde) { //如果满足这个条件,插入
arr2[j] = arr[k];
k++;
} else{ // 如果不满足上述的条件,将原来数组的值赋值给新数组。
arr2[j] = InsertNum;
}
}
System.out.println("=========3.输出最终结果============");
for(int i = 0; i< arr2.length;i++){
System.out.print(arr2[i] + "\t");
}
}
}