【韩老师零基础30天学会Java 】06章 数组、排序和查找

embedded/2024/11/13 23:23:02/

第六章 数组、排序和查找

1. 数组🚩🚩

数组介绍:
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即:数组就是一组数据。

示例:

java">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数组,并输出。

java">		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-静态初始化
在这里插入图片描述

数组使用注意事项和细节:

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  3. 数组创建后有默认值,如果没有赋值int 0,short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000 ,boolean false, String null。
  4. 使用数组的步骤 1.声明数组并开辟空间 2. 给数组各个元素赋值 3 .使用数组。
  5. 数组的下标是从0开始的。
  6. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如int int[] arr=new int[5]; 则有效下标为 0-4。
  7. 数组属引用类型,数组型数据是对象(object)。

练习1:
在这里插入图片描述

java">		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:
在这里插入图片描述

java">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:
在这里插入图片描述

数组赋值机制❗❗❗

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

值传递和引用传递的区别❗❗❗在这里插入图片描述

数组拷贝(内容复制),数据空间是独立的 ,修改一个,另一个不受影响。
在这里插入图片描述

  • 代码:
java">		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]);}

数组反转

方式一:找规律❗

  1. 把arr[0]元和 arr[5]进行交换{66,22,33,44,55,11}。
  2. 把arr[1]和 arr[4]进行交换{66,55,33,44,22,11}。
  3. 把 arr[2]和 arr[3]进行交换{66,55,44,33,22,11}。
  4. 一共要交换3次= arr.length。
  5. 每次交换时,对应的下标 是 arr[i]和 arr[arr.length-1-i]。
  • 代码:
java">		//数组反转:方式一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]);}

方式二:使用逆序赋值

  • 代码:
java">		//数组反转:方式二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]);}

数组添加
在这里插入图片描述

  • 代码
java">		//扩容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]);}

实现动态扩容
在这里插入图片描述

  • 代码
java">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("退出");}
}

练习:
在这里插入图片描述

  • 代码
java">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。

  • 代码
java">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])

java">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——列数

  • 代码
java">		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
在这里插入图片描述

  • 代码
java">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();}					}
}

二维数组遍历求和

  • 代码
java">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);					}
}

杨辉三角?在这里插入图片描述

在这里插入图片描述

  • 代码
java">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:
在这里插入图片描述


http://www.ppmy.cn/embedded/136949.html

相关文章

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。&#xff08;本次实验中未使用&#xff09; 4.上层通过静…

基于开源AI智能名片2+1链动模式S2B2C商城小程序源码的连环消费链条优化研究

摘要&#xff1a;随着电子商务的快速发展&#xff0c;如何提高顾客的复购率成为了商家关注的焦点。本文通过对开源AI智能名片21链动模式S2B2C商城小程序源码的研究&#xff0c;探讨了如何利用自动化促销模式构建连环消费链条&#xff0c;从而不断刺激顾客复购。本文首先介绍了连…

【大数据学习 | HBASE高级】region split机制和策略

1. region split机制 ​ HRegionServer拆分region的步骤是&#xff0c;先将该region下线&#xff0c;然后拆分&#xff0c;将其子region加入到hbase:meta表中&#xff0c;再将他们加入到原本的HRegionServer中&#xff0c;最后汇报Master。 split前&#xff1a;hbase:meta表有…

React 源码学习01 ---- React.Children.map 的实现与应用

1. 使用方法 React.Children.map(children, function[(thisArg)])2. 方法解释 在 children 里的每个直接子节点上调用一个函数&#xff0c;并将 this 设置为 thisArg。如果 children 是一个数组&#xff0c;它将被遍历并为数组中的每个子节点调用该函数。如果子节点为 null 或…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

【LeetCode】【算法】33. 搜索旋转排序数组

LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k…

【测试】【Debug】pytest运行后print没有输出

import pytest def test_good():for i in range(1000):print(i)def test_bad():print(this should fail!)assert False比如上述程序&#xff0c;运行之后只能看到输出了’this should fail!&#xff1b;但是debug版的测试运行后又能看到test_good函数中的输出。 这是为什么呢&a…

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…