数组的算法
一、数组基本算法:
1.1数组的求和
//静态声明数组
int[] arr={1,3,5,7,9};
//第一步:遍历数组,得到数组的每一个元素,把每一个元素进行累加
int sum=0;
//遍历数组 /如果我们使用的是IDEA开发,那么有一个快捷键:arr.fori可以直接输出for循环的内容
for(int i=0;i<arr.length;i++){
sum=sum+arr[i];
}
//输出sum
System.out.println(sum);
1.2数组求最大值,最小值
int[] arr={1,3,2,5,4};
//这个和打擂台相似,先要有一个擂主
int max=arr[0];
int min=arr[0];
//遍历数组
for(int i=0;i<arr.length;i++){
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
System.out.println(max);
System.out.println(min);
1.3数组的复制
int[] arr={1,3,5,7,9};
//先定义一个空的数组(确定数组的长度)
int[] arr1=new int[arr.length];
//然后遍历arr,得到arr的每一个元素,再赋值给arr1
for(int i=0;i<arr.length;i++){
arr1[i]=arr[i];
}
//遍历复制完之后的arr1
for(int i=0;i<arr1.length;i++){
System.out.print(arr1[i]+"\t");
}
1.4数组的合并
//需求:将两个数组合为一个数组
int[] arr={1,3,5};
int[] brr={7,9,11,13};
//分析:定义一个空的数组,接收两个数组的值,确定长度arr.length+brr.length
int[] crr=new int[arr.length+brr.length];
for(int i=0;i<arr.length;i++){
crr[i]=arr[i];
}
for(int i=0;i<brr.length;i++){
crr[i+arr.length]=brr[i];
}
for(int i=0;i<crr.length;i++){
System.out.print(crr1[i]+"\t");
}
1.5数组的反转
//第一种方法:倒着遍历
int[] arr={2,4,6,8,10};
for(int i=arr.length-1;i>=0;i--){
System.out.print(arr[i]);
}
//第二种方法:交换思想
arr: 2|4|6|8|10
下标: 0|1|2|3|4
arr[0]与arr[4]进行交换
arr[1]与arr[3]进行交换
int[] arr={2,4,6,8,10};
for(int start=0,end=arr.length-1;start<end;start++,end--){
//arr[start]与arr[end]进行交换
int c=arr[start];
arr[start]=arr[end];
arr[end]=c;
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
二、数组高级算法:
2.1数组的增删改查
//需求:键盘录入一个数,查找这个数是否存在,存在的话输出下标,如果不存在给出提示“此数据不存在”
import java.util.*;
int[] arr={1,3,5,7,9};
System.out.println("请输入一个数:");
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
//进行查找的步骤
for(int i=0;i<arr.length;i++){
if(arr[i]==num){
System.out.println("角标为:"+i);
}else{
System.out.println("查无此数据");
}
}
//输出结果
请输入一个数:1
角标为0
查无此数据
查无此数据
查无此数据
查无此数据
//那么如何改进呢??
这里涉及一种思想:先默认此数据没有找到,定义此数据的角标是一个负数
//改进后的代码:
import java.util.*;
int[] arr={1,3,5,7,9};
System.out.println("请输入一个数:");
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int index=-1; //关键的一步
//进行查找的步骤
for(int i=0;i<arr.length;i++){
if(arr[i]==num){
index=i;
System.out.println("角标为:"+index);
}
}
if(index==-1){
System.out.println("查无此数据");
}
//输出结果
请输入一个数:1
角标为0
查找5第一次出现时的角标
int[] arr={1,3,5,6,5,9};
int num=5;
//默认没有找到的情况
int index=-1;
//遍历数组
for(int i=0;i<arr.length;i++){
//判断数组中的每一个元素是否和num相同
if(arr[i]==num){
index=i;
System.out.println("角标为:"+index);
break; //找到元素第一次出现的位置后,跳出循环
}
}
if(index==-1){
System.out.println("查无此数据");
}
//输出结果:角标为2
2.2 排序--冒泡算法
int[] arr={2,6,3,8,1};
//需求:按照从小到大的顺序排列
//什么是冒泡排序:每两个相邻元素都要进行比较,然后用到一个交换思想
if(arr[0]>arr[1]) 交换位置
if(arr[1]>arr[2]) 交换位置
if(arr[2]>arr[3]) 交换位置
if(arr[3]>arr[4]) 交换位置
//结论:四个if语句走完,数组的最大值会到最右边
if(arrr[0]>arr[1]){
int c=arr[0];
arr[0]=arr[1];
arr[1]=c;
}
if(arrr[1]>arr[2]){
int c=arr[1];
arr[1]=arr[2];
arr[2]=c;
}
if(arrr[2]>arr[3]){
int c=arr[2];
arr[2]=arr[3];
arr[3]=c;
}
if(arrr[3]>arr[4]){
int c=arr[3];
arr[3]=arr[4];
arr[4]=c;
}
//这里注意:if(arr[4]>arr[5]) //角标从0-4,如果出现5就会出现角标越界的情况
//四个if合而为一,如下所示
for(int i=0;i<arr.length-1;i++){
int c=arr[i];
arr[i]=arr[i+1];
arr[i+1]=c;
}
//第一次遍历之后,数组为 2,3,6,1,8
//这时候还没完成我们的需求:从小到大排序,而我们第一遍走完之后,数组中的最大值到了最右边
//倒数第二大的值如果想往最右边的倒数第二个位置靠,就再走三个if语句,加上最开始的一个if语句,一个四个if语句
第一次走完:2|3|6|1|8
第二次走完:2|3|1|6|8
第三次走完:2|1|3|6|8
第四次走完:1|2|3|6|8
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-1;j++){
int c=arr[j];
arr[j]=arr[j+1];
arr[j+1]=c;
}
}
//输出排完序之后的数组:
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
课后作业
package com.homework;
/*1、歌唱比赛打分,各评委的分分别为{10, 9, 9.5, 9.4, 9.7, 9.2, 8.8, 8},
要求去掉最高分和最低分后求平均分。*/
public class Demo_Hw1 {
public static void main(String[] args) {
double[] arr={10,9,9.5,9.4,9.7,9.2,8.8,8};
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length-1; j++) {
if(arr[j]>arr[j+1]){
double c=arr[j];
arr[j]=arr[j+1];
arr[j+1]=c;
}
}
}
double[] arr1=new double[arr.length-2];
double sum=0;
for (int i = 1; i < arr.length-1; i++) {
arr1[i-1]=arr[i];
}
for (int i = 0; i < arr1.length; i++) {
sum=sum+arr1[i];
}
System.out.println(sum/arr1.length);
}
}
package com.homework;
/*2、找出以下数组的最大值、最小值{10,9,12,15,4,3}*/
public class Demo_Hw2 {
public static void main(String[] args){
int[] arr={10,9,12,15,4,3};
int max=arr[0];
int min=arr[0];
for (int i = 0; i < arr.length; i++) {
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
System.out.println(max+"\t"+min);
}
}
package com.homework;
/*2、找出以下数组的最大值、最小值{10,9,12,15,4,3}*/
public class Demo_Hw2 {
public static void main(String[] args){
int[] arr={10,9,12,15,4,3};
int max=arr[0];
int min=arr[0];
for (int i = 0; i < arr.length; i++) {
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
System.out.println(max+"\t"+min);
}
}
package com.homework;
import java.util.Scanner;
/*4、键盘录入8个double类型数字放数组里面,求最大值、最小值*/
public class Demo_Hw4 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double[] arr=new double[3];
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"个数");
arr[i]=sc.nextDouble();
}
double max=arr[0];
double min=arr[0];
for (int i = 0; i < arr.length; i++) {
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
System.out.println(max+"\t"+min);
}
}
package com.homework;
/*5、double[] arr={10.3,8,6,4.2,2},请用数组的算法将这个数组反序打印出来(两种方法)。*/
public class Demo_Hw5 {
public static void main(String[] args) {
double[] arr={10.3,8,6,4.2,2};
/*for(int i=arr.length-1;i>=0;i--){
System.out.print(arr[i]+"\t");
}*/
for(int i=0,j=arr.length-1;i<j;i++,j--){
double c=arr[i];
arr[i]=arr[j];
arr[j]=c;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
package com.homework;
import java.util.Scanner;
/*6、定义一个长度为6的整型数组,输入数据,然后排序(按照从大到小的顺序)*/
public class Demo_Hw6 {
public static void main(String[] args) {
int[] arr=new int[6];
Scanner sc=new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"个数字");
arr[i]=sc.nextInt();
}
for (int i = 1; i < arr.length; i++) {
for (int j = arr.length-1; j >0; j--) {
if(arr[j]>arr[j-1]){
int c=arr[j];
arr[j]=arr[j-1];
arr[j-1]=c;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
package com.homework;
import java.util.Scanner;
/*7、老师查寝,寝室住了六个同学,定义一个数组循环接收六个同学的名字,若查到有此
同学,则输出此人的床位号(对应数组的下标),若寝室没有改同学,则给出提示:查无此人*/
public class Demo_Hw7 {
public static void main(String[] args) {
String[] arr=new String[6];
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"个同学的名字");
Scanner sc=new Scanner(System.in);
arr[i]=sc.next();
}
int index=-1;
System.out.println("请输入一个同学的名字");
Scanner sc=new Scanner(System.in);
String name=sc.next();
for (int i = 0; i < arr.length; i++) {
if(name.equals(arr[i])){
index=i;
System.out.println("床号"+index);
break;
}
}
if(index==-1){
System.out.println("查无此人");
}
}
}