1.1重点是思路(找规律):
1.2. 代码(循环的次数,交换的两值以及如何交换)(缺少一个遍历,不写了)
char key = 'n';
int[] arr = {1,2,3};
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 = scanner.nextInt();
arrNew[arrNew.length-1] = num;
arr = arrNew;
System.out.println("扩容后数组为:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println("是否继续添加?y/n");
//第一种:在循环外定义变量,用while做出判断,跳出循环
key = scanner.next().charAt(0);
//第二种:在循环内定义变量,在循环内用if做判断,break跳出循环
//int key = scanner.next().charAt(0);
// if(key == 'n'){
// break;
// }
}while(key != 'n');
特点总结:
- 本案例一共5个元素
- 一共进行了4次排序(外循环次数)
- 每一次排序里比较的次数在减少(内循环次数)
- 每一次排序都能确定一个数的位置
- 第一次排序,内层循环4次,i=arr.length-1,i>0,i–; i=4 j=arr.length-1,j=4,3,2,1
i=3,j=4,3,2 arr.length-i
int[] arr = {24,69,80,13,57};
int temp = 0;
//外层循环-->几轮排序
for(int i = arr.length-1;i > 0;i--){
//内层循环-->几次比较
//每一次比较都从最后一个元素开始,所以int j = arr.length-1
//找规律:i = 4时,j = 4,3,2,1
//i = 3时,j = 4,3,2
//以此类推发现:j最小的数 + i = 5 ,所以j的临界就是arr.length-i
for(int j = arr.length-1;j >= arr.length-i;j--){
//j和j-1进行比较,不能是j和j+1,那样会越界(和前一个进行比较)
if(arr[j - 1] > arr[j]){
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
System.out.println("=====排序后=====");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
int[] arr = {24,69,80,13,57};
int temp = 0;
for(int i = 0;i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
//和后一个进行比较
if(arr[j + 1] < arr[j]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("=====排序后=====");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
二分查找:对有序数组进行查找,先让要查找的数和数组中间的数比较,若比中间数字大,则和数组右半边的中间的数进行比较,若比中间数字小,则和数组左半边的中间的数进行比较,依此类推
一个经典验证方法:
定义一个变量,判断查找有没有成功,如果成功,该变量值=下标,如果不成功,则保留该变量原先的数值
import java.util.Scanner;
public class HelloWorld {
public static void main(String []args) {
Scanner n = new Scanner(System.in);
String[] arr = {"王胖子","高瘦子","高梦梦"};
System.out.println("请输入一个名字");
String findName = n.next();
int index = -1;
for(int i = 0;i < arr.length;i++){
if(findName.equals(arr[i])){
System.out.println("找到了"+findName+"下标为:"+i);
index = i;
}
}
if(index == -1){
System.out.println("未找到"+findName);
}
}
}
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
//换行
System.out.println();
}
数据类型 [][] 数组名 = new 数据类型[大小][大小]
1.1 第一个大小是一维数组的个数
1.2 第二个大小是一维数组中元素的个数
二维数组在栈中指向堆中的一块地址,这个地址中保存了二维数组的两个元素(两个一维数组)的地址,这两个地址中保存了一维数组的元素
1.1 先声明:类型[][] 数组名;
1.2 再定义(开辟空间):数组名 = new 类型[大小][大小]
1.3 赋值(有默认值)
1.4 使用
重点是:
如果是第一个和最后一个赋为1
如果是中间的(不是第一个和最后一个)就是arr[i - 1][j] + arr[i - 1][j - 1]
public class HelloWorld {
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++){
if(j == 0 || j == arr[i].length-1){
arr[i][j] = 1;
}else{
//重点是这一句:给不是第一个和最后一个元素赋值
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
for(int i = 0;i < arr.length;i++){
for(int j =0;j < arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
Scanner scanner = new Scanner(System.in);
int[] arr = {10,12,45,90};
//数组扩容
//创建一个新数组,将arr数组拷贝到新数组中
//插入数字,并让arr指向新数组
int[] newArr = new int[arr.length+1];
System.out.println("请输入要插入的数字");
int findName = scanner.nextInt();
for(int i = 0;i < arr.length;i++){
newArr[i] = arr[i];
}
newArr[newArr.length - 1] = findName;
arr = newArr;
//进行冒泡排序
int temp = 0;
for(int i = arr.length - 1;i > 0;i--){
for(int j = arr.length - 1;j >= arr.length - i;j--){
if(arr[j - 1] > arr[j]){
System.out.println(arr[j-1]+"换成了"+arr[j]);
temp = arr[j];
arr[j] = arr[j - 1];
arr[j-1] = temp;
}
}
}
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
顺序查找有两种情况
- 要插入的值比数组中的值都大,则插入到数组最后面(用一个index变量判断)
- 若数组中有比插入的值大的元素,那么插入值就插入到该元素的这个位置(index来接收下标值)
数组扩容
- 这里注意:通常的扩容在拷贝元素时,只定义一个变量i,使得旧数组的元素挨个拷贝进新数组
- 在这里要想把插入的数插入到对应的位置上,新旧两个数组的下标就不能同时增长,要定义两个变量i和j
2.1 当新数组下标值i不等于index时,i和j同时增长,旧数组的元素挨个拷贝进新数组
2.2 当新数组下标值i等于index时,j不增长,也就是旧数组中的下标不进行移动,把插入值赋给arrNew[i](下标:一个++,一个不动)
public class HelloWorld {
public static void main(String []args) {
int[] arr = {10,12,45,90};
//1. 顺序查找,看添加的数要放在数组的哪个位置上
int findName = 23;//可以变成输入,这里不变了
//这是一个接收/判断变量
int index = -1;
for(int i = 0;i < arr.length;i++){
/*1.1 输入的数和数组元素进行比较,将该数插到第一个大于该数的数组元素的位置上
findName <= arr[i]时,插入的下标为i */
if(findName <= arr[i]){
index = i;
break;
}
}
/*1.2 判断index的值,来判断输入的数是否找到了自己的位置
findName <= arr[i]不成立,则插入到最后位置*/
if(index == -1){
index = arr.length;
}
//2. 数组扩容
//将输入的数插到指定位置
int[] arrNew = new int[arr.length+1];
for(int i = 0,j = 0;i < arrNew.length;i++){
if(i != index){
arrNew[i] = arr[j];
j++;
}else{
arrNew[i] = findName;
}
}
arr = arrNew;
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
}
public class HelloWorld {
public static void main(String []args) {
//随机生成10个数字存入数组
int[] arr = new int[10];
double avg = 0;
double sum = 0;
for(int i = 0;i < arr.length;i++){
arr[i] = (int)(Math.random() * 100 + 1);
sum += arr[i];
}
System.out.println("======生成的数组为======");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
//倒序打印
int[] arrNew = new int[10];
for(int i = 0,j = arrNew.length - 1;i < arrNew.length;i++,j--){
arrNew[i] = arr[j];
}
System.out.println("======倒序后的数组为======");
for(int i = 0;i < arrNew.length;i++){
System.out.print(arrNew[i]+"\t");
}
System.out.println();
//计算平均值(注意精度)
avg = sum / arr.length;
System.out.println("======数组元素的平均值为======");
System.out.println("平均值 = " + avg);
//求最大值及其下标
int max = arr[0];
int index = 0;
for(int i = 1;i < arr.length;i++){
if(arr[i] > max){
max = arr[i];
index = i;
}
}
System.out.println("======数组元素的最大值及其下标为======");
System.out.println("最大值 = " + max);
System.out.println("最大值下标 = " + index);
//查找数组中是否有8(减少数据耦合,所以另外定义findNum而不是在程序中直接写8)
//为了让没找到时输出:没找到,所以定义了一个变量来判断(找到改变该值,没找到不改变)
int findNum = 8;
int index1 = -1;
for(int i = 1;i < arr.length;i++){
if(findNum == arr[i]){
System.out.println("======数组元素的是否有8======");
System.out.println("找到数"+findNum+"下标为"+index1);
break;
}
}
if(index1 == -1){
System.out.println("没有找到数"+findNum);
}
}
}