JAVA20231208
171排序
排序的介绍:
排序是将多个数据,依指定的顺序进行排列的过程
排序的分类:
-
内部排序:
指将需要处理的所有数据都加载到内存储存器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法) -
外部排序:
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)
172173冒泡排序法:
冒泡排序基本思想:通过对待排序序列从后往前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。
实例分析:
public class BubbleSore{
public static void main(String[] args){
//需求分析:
//对数组24、69、80、57、13实现冒泡排序
//
//思路分析:
//创建一个数组 int []arr
//两个for循环实现 从小往大排 arr[i] > arr[i+1] 交换
//
//代码实现:
int []arr = {24,69,80,57,13};
for(int i = 0;i < arr.length-1;i++){
for(int j =0;j < arr.length-1-i;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;//冒泡排序完成
}
}
}
System.out.print("冒泡排序(从小到大)后遍历输出:");
for(int k = 0;k < arr.length;++k){//遍历输出排序后的数组
System.out.print(arr[k] + "\t");
}
}
}
//
//冒泡排序思路:
//假设从小往大排
//在一个数组中外层for循环条件一共要进行(arr.length-1)次:
//以实例数组[24,69,80,57,13]分析
//外层循环第一次目的是将数值最大元素(80)放在数组的最大下标(最后一位)
// 第二次目的是将数值第二大元素(69)放在数组的第二大下标(倒数第二位)
// 第三次目的是将数值第三大元素(57)放在数组的第三大下标(倒数第三位)
// 第四次目的是将数值第四大元素(24)放在数组的第四大下标(倒数第四位)
// 13为最小的一个数其他元素放置好之后他自己就会位于首位 无需再进行一次循环
//内层循环第一次中需五个数依次两两比较共比较四次
// 第二次中需四个数依次两两比较共比较三次
// 第三次中需三个数依次两两比较共比较两次
// 第四次中需两个数依次两两比价共比较一次 则内层for循环条件应为 arr.length-1-i(i为外层循环变量,初始值为0)
174查找:
介绍:在java中常用的查找有两种:
- 顺序查找 SepSearch.java
- 二分查找 (算法讲解)
案例分析:
import java.util.Scanner;
public class SepSearch{
public static void main(String[] args){
//需求分析:
//有一个数列:白眉鹰王,金毛狮王,紫衫龙王、青翼蝠王猜数游戏:
//从键盘中任意输入一个名称,判断数列中是否包含此名称
//要求:如果找到了,就提示找到,并给出下标值
//
//思路分析:
//Scanner 键盘输入提示语
//new一个String数组 for遍历 if判断 int index 接受下标值
//
//代码实现:
Scanner myScanner = new Scanner(System.in);
int index = -1;
String [ ]arr = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
System.out.print("请输入要找的王:");
String name = myScanner.next();
for(int i = 0; i < arr.length;++i){
if(arr[i].equals(name)){
index = i;
System.out.print("\n已找到:" + name +"\t其下标值为:" + index);
break;
}
}
if(index == -1){
System.out.print("\n对不起没有找到:" + name);
}
}
}
175多维数组-二维数组
快速入门:
import java.util.Scanner;
public class TwoDimensionalArry01{
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
*/
//思路分析:
//new一个二维数组
//使用两个for循环实现 导入Scanner实现键盘输入
//使用两个for循环遍历输出
//
//代码实现:
Scanner myScanner = new Scanner(System.in);
int [ ][ ]arr = new int[4][6];
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;++j){
System.out.print("请输入第"+ (i+1) +"行的第"+(j+1)+"个值:");
arr [i][j] = myScanner.nextInt();
}
}
System.out.println("\n=======输出二维数组=======");
for(int m = 0;m < arr.length;m++){
for(int n = 0;n < arr[m].length;n++){
System.out.print(arr[m][n] + "\t");
}
System.out.println();
}
}
}
176177178179二维数组的使用
使用方式1:动态初始化
- 语法:类型[ ] [ ] 数组名 = new 类型[大小] [大小]
比如:int a [ ] [ ] = new int [2] [3] - 二维数组在内存的存在形式(图)
使用方式2:动态初始化
- 先声明:类型 数组名[ ] [ ];
- 再定义(开辟空间):数组名 = new 类型 [大小] [大小]
- 赋值(有默认值,比如int类型的就是0)
使用方式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();//换行
}
}
}
使用方法4:静态初始化
定义 : 类型 数组名[ ] [ ] = {{值1,值2…},{值1,值2…},{值3,值4…}}
比如:int [ ] [ ] arr = {{1,1,1},{8,8,9},{100}};
180二维数组的遍历
案例:
public class TwoDimensionalArry02{
public static void main(String[] args){
//需求分析:
//int arr [][] = {{4,6},{1,4,5,7},{-2}};遍历该二维数组,并得到和
//思路分析:
//new arr for遍历数组 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.print("二维数组的总和为:" + sum);
}
}