JavaSE基础篇_数组中涉及的一些常用算法

数组的算法

一、数组基本算法:

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("查无此人");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值