第六章 数组、排序和查找
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]是charchars[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-1for(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: