韩顺平Java入门第十四天(排序、查找)
1.排序
1).排序的介绍:排序是将多个数据,依指定的顺序进行排列的过程。
2).内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
3).外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
4).冒泡排序法:
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素 的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
public class BubbleSort {
//编写一个 main 方法
public static void main(String[] args) {
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 - 1 - i; 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 k = 0; k < arr.length; k++) {
System.out.print(arr[k] + "\t");
}
}
}
}
2.查找
在 java 中,我们常用的查找有两种:
1) 顺序查找 SeqSearch.java
2) 二分查找【二分法,我们放在算法讲解】
案例演示:
1) 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否 包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。
import java.util.Scanner;
public class SeqSearch{
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);
index = i;
//把i保存到index
break;}
}
if (index == -1) {
//没有找到
System.out.println("没有找到");
}
}
}
3.多维数组-二维数组
多维数组我们只介绍二维数组。
二维数组的应用场景:比如我们开发一个五子棋游戏,棋盘就是需要二维数组来表示。如图:
1).快速入门案例:
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();//换行
}
}
}
2).使用方式
①动态初始化
1) 语法: 类型[][] 数组名=new 类型[大小][大小]
2) 比如: int a[][]=new int[2][3]
3) 使用演示
4) 二维数组在内存的存在形式(!!画图)
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();//换行
}
}
}
如图:二维数组先指向一个空间,空间中存放的是一维数组。空间中的一维数组仍然遵循引用存放规则,所以在空间中存放的是一维数组的地址。
② 动态初始化
先声明:类型 数组名[][];
再定义(开辟空间) 数组名 = new 类型[大小][大小] 赋值
(有默认值,比如 int 类型的就是 0)
③ 动态初始化-列数不确定
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();//换行
}
}
}
④ 静态初始化
定义 类型 数组名[][] = {{值 1,值 2..},{值 1,值 2..},{值 1,值 2..}}
使用即可 [ 固定方式访问 ] 比如: int[][] arr = {{1,1,1}, {8,8,9}, {100}};
解读:
1. 定义了一个二维数组 arr。
2. arr 有三个元素(每个元素都是一维数组)
3. 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素。
案例:
int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和。
public class TwoDimensionalArray05 {
//编写一个 main 方法
public static void main(String[] args) {
/*int arr[][]={{4,6},{1,4,5,7},{-2}};
遍历该二维数组,并得到和
思路1. 遍历二维数组,并将各个值累计到 int sum
*/
int arr[][]= {{4,6},{1,4,5,7},{-2}};
int sum = 0; for(int i = 0; i < arr.length; i++) {
//遍历每个一维数组
for(int j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
}
}System.out.println("sum=" + sum);
}
}
练习题:10行杨辉三角
//自己写的
public class YangHui {
public static void main(String[] args) { //编写一个 main 方法
/*看一个需求:
十行杨辉三角形
*/
int[][] arr = new int[10][]; //创建 二维数组
for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
arr[i] = new int[10]; //给每个一维数组开空间 new 如果没有给一维数组 new ,那么 arr[i]就是 null
for(int j = 0; j < i + 1; j++) { //遍历一维数组,并给一维数组的每个元素赋值
if (i==0 || j==0 ) {
arr[i][j]=1;
}else {
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
}//赋值
}
}
System.out.println("=====杨辉三角====="); //遍历 arr 输出
for(int i = 0; i < arr.length; i++) { //输出 arr 的每个一维数组
for(int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == 0) {
System.out.print(" ");
}else {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();//换行
}
}
}
//老师写的
public class YangHui {
public static void main(String[] args) { //编写一个 main 方法
/*看一个需求:
十行杨辉三角形
*/
int[][] arr = new int[10][]; //创建 二维数组
for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
arr[i] = new int[i+1]; //给每个一维数组开空间 new 如果没有给一维数组 new ,那么 arr[i]就是 null
for(int j = 0; j < arr[i].length ; j++) { //遍历一维数组,并给一维数组的每个元素赋值
if (j==0 || j == arr[i].length - 1 ) {
arr[i][j]=1;
}else {
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
}//赋值
}
}
System.out.println("=====杨辉三角====="); //遍历 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();//换行
}
}
}
3).二维数组使用细节和注意事项
① 一维数组的声明方式有: int[] x 或者 int x[]
② 二维数组的声明方式有: int[][] y 或者 int[] y[] 或者 int y[][]
③ 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][]
是 一个二维数组 int map [][] = {{1,2},{3,4,5}}
由 map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等 的二维数组。
课堂练习:
-----文章为自学笔记,学习的课程是B站上的韩顺平30天学JAVA,文章标题的天数是自己学习的天数-----