【老韩视频168-174】
9. 数组添加/扩容
要求:实现动态的给数组添加元素效果,实现对数组扩容。
- 原始数组使用静态分配int[] arr = {1,2,3}
增加的元素4,直接放在数组的最后 arr = {1,2,3,4}
public class Test {
public static void main(String[] args) {
//思路分析:
//1. 定义原始数组
int[] arr = {1,2,3};
//2. 定义一个新的数组,大小是arr.length + 1;
int[] arr2 = new int[arr.length + 1];
//3. 遍历arr数组,将arr元素拷贝到arr2数组
//再将4赋值给arr2[arr2.length - 1] = 4;
for(int i = 0; i < arr.length + 1; i++){
if(i < arr.length){
arr2[i] = arr[i];
}
arr2[i] = 4;
}
//4. 把arr2的地址拷贝给arr,完成扩容。
arr = arr2;
}
}
- 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n【动态化扩容】
public class Test {
public static void main(String[] args) {
//思路分析:
//1. 创建一个Scanner来接收用户的输入。
//2. 因为用户什么时候退出不确定,使用dowhile + break来控制。
int[] arr = {1,2,3};
import java.util.Scanner;
Scanner myScanner = new Scanner(System.in);
do{
int[] arr2 = new int[arr.length + 1];
//拷贝原始数组。
for(int i = 0; i < arr.length; i++){
arr2[i] = arr[i];
}
System.out.println("请输入你要添加的元素");
int addNum = myScanner.nextInt();
//把addNum赋值给arr2的最后一位数
arr2[arr2.length - 1] = addNum;
arr = arr2;
System.out.println("是否继续添加y/n");
char key = myScanner.next().charAt(0);
if(key == 'n'){
break;
}
}while(true);
System.out.println("您已退出添加...");
}
}
10. 数组缩减
有一个数组 {1, 2, 3, 4, 5}, 可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素。当只剩 下最后一个元素,提示,不能再缩减。
public class Test {
public static void main(String[] args) {
//思路分析:跟动态扩容很像,思考。
int[] arr = {1,2,3,4,5};
import java.util.Scanner;
Scanner myScanner = new Scanner(System.in);
//定义一个新的数组。
int[] arr2 = new int[arr.length -1];
do{
for(int i = 0; i < arr2.length; i++){
arr2[i] = arr[i];
}
arr = arr2;
System.out.pritnln("是否继续缩减?y/n");
char answer = myScanner.next().charAt(0);
if(answer = 'n'){
break;
}
}while(true);
}
}
11. 排序
- 定义:排序是将多个数据,依指定的顺序进行排列的过程。
- 排序的分类:
- 内部排序法:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择 式排序法和插入式排序法)。
- 外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
12. 冒泡排序法
- 冒泡排序(Bubble Sorting)的基本思想: 通过对“待排序序列”从后向前,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。
- 冒泡排序法案例:
将五个无序:24,69,80,57,13 使用冒泡排序法排成一个从小到大的有序数列。
- 思路:
- 代码:
public class BubbleSort {
public static void main(String[] args) {
//化繁为简,先死后活
//1. 先实现第一轮排序。
int[] arr = {24, 69, 80, 57, 13};
int temp = arr[j + 1];//用来辅助交换的变量。
for(int j = 0; j < 4; j++){//4次计较
if(arr[j] > arr[j + 1]){
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
//2. 如何实现第二轮。
//只需要改变j的范围
for(int j = 0; j < 3; j++){//3次计较
if(arr[j] > arr[j + 1]){
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
//3. 用2层循环来实现所有的东西!!!!
int[] arr = {24, 69, 80, 57, 13};
int temp = arr[j + 1];//用来辅助交换的变量。
//加一个外循环.
for(int i = 0; i < arr.length - 1; i++){
for(int j = 0; j < arr.length - 1 - i; j++){//4次计较
if(arr[j] > arr[j + 1]){
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
}
13. 查找
在 java 中,我们常用的查找有两种:
- 顺序查找
- 二分查找【二分法,我们放在算法讲解】
- 案例:
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否 包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。
- 注意⚠️:string的比较要用equals。
public class SeqSearch {
public static void main(String[] args) {
//思路:
//1. 定义一个string数组
//2. 接收用户输入,遍历数组,逐一比较。如果有,则提示信息,并推出。
String[] names = {白眉鹰王, 金毛狮王, 紫衫龙王, 青翼蝠王};
import java.util.Scanner;
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String findName = myScanner.next();
//这里老韩有一个很厉害的编程思想。
int index = -1;
for(int i = 0; i < names.length; i++){
//string的比较要用equals
if(findName.equals(names[i])){
System.out.println("恭喜你找到了" + findName);
System.out.println("下标为 = " + i);
index = i
break; //找到就退出。
}
}
//如果循环结束后index = -1,证明一直都没有找到。
if(index == -1){
System.out.println("不好意思,没找到" + findName);
}
}
}
- 请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标, 如果没有就提示"没有这个数"。
public class SeqSearch {
public static void main(String[] args) {
//
int arr = {1,8, 10, 89, 1000, 1234};
import java.util.Scanner;
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入数字");
int findNum = myScanner.nextInt();
int index = -1;//用来辅助确定,每一个index都没有找到一样的。
for(int i = 0; i < arr.length; i++){
if(findNum == arr[i]){
System.out.println("找到" + findNum);
System.out.println("下标为" + i);
}
}
if(index == -1){
System.out.println("不好意思没有找到" + findNum);
}
}
}