【韩老师零基础30天学会Java 】06章 数组、排序和查找
第六章 数组、排序和查找
1. 数组🚩🚩
数组介绍:
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即:数组就是一组数据。
示例:
double [] hens={3,5,1,3,4,2,50,7.8,88.8,1.1,5};
double totalWeight=0;
for(int i=0;i<hens.length;i++){
totalWeight+=hens[i];
}
System.out.println("总体重="+totalWeight+"平均体重="+totalWeight/hens.length);
数组的使用方式1-动态初始化
示例: 循环输入5个成绩,保存在double数组,并输出。
Scanner input=new Scanner(System.in);
double[] scores=new double[5];
for(int i=0;i<scores.length;i++){
System.out.println("请输入第"+(i+1)+"个元素");
scores[i]=input.nextDouble();
}
//输出遍历数组
for(int i=0;i<5;i++){
System.out.println(scores[i]);
}
使用方式2-动态初始化
1)先声明数组
语法:数据类型 数组名[];也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;
2)创建数组
语法: 数组名=new 数据类型[大小];
a=new int[10];
使用方式3-静态初始化
数组使用注意事项和细节:
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
- 数组创建后有默认值,如果没有赋值int 0,short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000 ,boolean false, String null。
- 使用数组的步骤 1.声明数组并开辟空间 2. 给数组各个元素赋值 3 .使用数组。
- 数组的下标是从0开始的。
- 数组下标必须在指定范围内使用,否则报:下标越界异常,比如int int[] arr=new int[5]; 则有效下标为 0-4。
- 数组属引用类型,数组型数据是对象(object)。
练习1:
char[] chars=new char[26];
for(int i=0;i<chars.length;i++){
//chars 是 char[]
//chars[i]是char
chars[i]=(char)('A'+i);//'A'+i 是int
}
//输出
for(int i=0;i<chars.length;i++){
System.out.print(chars[i]+" ");
}
练习2:
public class IntDetail{
public static void main(String[] args){
int[] arr={4,-1,9,10,23};
int max=arr[0];
int maxIndex=0;
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
maxIndex=i;
}
}
System.out.println("max="+max+" "+ "下标:"+maxIndex);
}
}
练习3:
数组赋值机制❗❗❗
值传递和引用传递的区别❗❗❗
数组拷贝(内容复制),数据空间是独立的 ,修改一个,另一个不受影响。
- 代码:
int[] arr1={4,-1,9,10,10,23,110,-23,56,888,-256};
int [] arr2=new int[arr1.length];
for(int i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
System.out.println("arr1的数组元素:");
for(int i=0;i<arr1.length;i++){
System.out.println(arr1[i]);
}
arr2[0]=456;
System.out.println("arr2的数组元素:");
for(int i=0;i<arr1.length;i++){
System.out.println(arr2[i]);
}
数组反转
方式一:找规律❗
- 把arr[0]元和 arr[5]进行交换{66,22,33,44,55,11}。
- 把arr[1]和 arr[4]进行交换{66,55,33,44,22,11}。
- 把 arr[2]和 arr[3]进行交换{66,55,44,33,22,11}。
- 一共要交换3次= arr.length。
- 每次交换时,对应的下标 是 arr[i]和 arr[arr.length-1-i]。
- 代码:
//数组反转:方式一
int[] arr1={7,4,-1,9,10,23,110};
for(int i=0;i<arr1.length/2;i++){
int tmp=arr1[i];
arr1[i]=arr1[arr1.length-1-i];
arr1[arr1.length-1-i]=tmp;
}
System.out.println("===反转后的数组元素===");
for(int i=0;i<arr1.length;i++){
System.out.println(arr1[i]);
}
方式二:使用逆序赋值
- 代码:
//数组反转:方式二
int[] arr1={7,4,-1,9,10,23,110};
int[] arr2=new int[arr1.length];
for(int i=0;i<arr1.length;i++){
arr2[i]=arr1[arr1.length-1-i];
}
System.out.println("===反转后的数组元素===");
for(int i=0;i<arr2.length;i++){
System.out.println(arr2[i]);
}
数组添加
- 代码
//扩容
int[] arr={1,2,3,4};
int[] arrNew=new int[arr.length+1];
for(int i=0;i<arr.length;i++){
arrNew[i]=arr[i];
}
arrNew[arrNew.length-1]=4;
arr=arrNew;
System.out.println("===arr扩容后的数组元素===");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
实现动态扩容
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
Scanner myScanner=new Scanner(System.in);
//扩容
int[] arr={1,2,3,4};
do{
int[] arrNew=new int[arr.length+1];
for(int i=0;i<arr.length;i++){
arrNew[i]=arr[i];
}
System.out.println("请输入元素:");
int num=myScanner.nextInt();
arrNew[arrNew.length-1]=num;
arr=arrNew;
System.out.println("===arr扩容后的元素===");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
//?问用户是否添加
System.out.println("是否继续添加y/n");
char key=myScanner.next().charAt(0);
if(key=='n')
break;
}while(true);
System.out.println("退出");
}
}
练习:
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
Scanner myScanner=new Scanner(System.in);
//减少
int[] arr={15,21,33,49,8,23,56,81};
do{//问用户是否减少
if(arr.length==1){
System.out.println("不能再减。");
break;
}else{
System.out.println("是否继续减少 y/n");
char key=myScanner.next().charAt(0);
if(key=='n')
break;
}
int[] arrNew=new int[arr.length-1];
for(int i=0;i<arrNew.length;i++){
arrNew[i]=arr[i];
}
arr=arrNew;
System.out.println("===arr缩减后的元素===");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}while(true);
System.out.println("退出");
}
}
2. 排序
排序介绍
排序是将一群数据,依指定的顺序进行排列的过程
排序的分类:
1.内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
2.外部排序法:
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
冒泡排序
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
总结冒泡排序特点
1.我们一共有5个元素。
2.一共进行了 4轮排序,可以看成是外层循环。
3.每1轮排序可以确定一个数的位置,比如第1轮排序确定最大数,第2轮排序,确定第2大的数位置,依次类推。
4.当进行比较时,如果前面的数大于后面的数,就交换。
5.每轮比较在减少 4->3->2->1。
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
//冒泡排序
int[] arr={24,69,80,57,13};
int len=arr.length;
int tmp=0;
//4:是轮数=length-1
for(int i=0;i<len;i++){
for(int j=0;j<len-i;j++){
if(arr[j]>arr[j+1]){
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
System.out.println("第"+i+"轮:冒泡排序后的结果:");
for(int k=0;k<len;k++){
System.out.print(arr[k]+" ");
}
System.out.print("\n");
}
}
}
输出:
3. 查找
顺序查找
字符串判断相等:
findName.equals(names[i])
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
//顺序查找
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++){
if(findName.equals(names[i])){
index=i;
System.out.println(names[i]);
System.out.println("下标为:"+i);
break;
}
}
if(index==-1){
System.out.print("没找到"+findName);
}
}
}
二分查找
4. 多维数组
二维数组
arr.length——行数 = 二维数组的元素个数
arr[0].length——列数
- 代码
int[][] arr={{1,2,3,4,5},{0,0,0,0,0},
{2,3,7,9,0}};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
二维数组使用:动态创建二维数组
形式:
1
2 2
3 3 3
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
int[][] arr= new int[10][];
for(int i=0; i < arr.length; i++){
arr[i] = new int[i+1];
for(int j=0;j<arr[i].length;j++){
arr[i][j]=i+1;
}
}
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();
}
}
}
二维数组遍历求和
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
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);
}
}
杨辉三角❗
- 代码
import java.util.Scanner;
public class IntDetail{
public static void main(String[] args){
int[][] yanghui= new int[10][];
for(int i=0;i<yanghui.length;i++){
yanghui[i]=new int [i+1];
for(int j=0;j<yanghui[i].length;j++){
if(j==0||j==yanghui[i].length-1){
yanghui[i][j]=1;
}else{
yanghui[i][j]=yanghui[i-1][j]+yanghui[i-1][j-1];
}
}
}
for(int i=0;i<yanghui.length;i++){
for(int j=0;j<yanghui[i].length;j++){
System.out.print(yanghui[i][j]+" ");
}
System.out.println();
}
}
}
输出:
二维数组使用细节和注意事项:
练习1:
答案:
b),e)✅
作业1:
答案:B、D、E❌
正确答案:B、D
作业2:
答案:blue✅
作业3:
答案:
1
3
5
❌
正确答案:
1
3
5
7
作业4:
作业5:
作业6:
答案:a,z,韩,c,a,z,韩,c❌
正确答案:
a,a
z,z
韩,韩
c,c
作业7: