栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据结构与算法01-数组(java实现)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构与算法01-数组(java实现)

1. 数组
数组的局限性:长度固定,一旦定义不能修改

1.1 数组元素的增加

核心思想:

​创建一个新数组,长度为原数组+1,将原数组赋值到新数组,
最后将增加的元素放到新数组最后一个位置,把新数组赋值给原数组。

代码实现:

import java.util.Arrays;

public class ArrayAppend {
    //在数组末尾追加一个元素
    public static void main(String[] args) {
        //解决数组长度不可变问题
        int[] arr=new int[]{1,2,3};
        //快速查看数组中的元素
        System.out.println(Arrays.toString(arr));

        //目标元素
        int aim=4;
        //创建新数组长度+1
        int[] newArr=new int[arr.length+1];
        //遍历将原数组的值放到新数组
        for (int i=0;i 

结果:

[1, 2, 3]
[1, 2, 3, 4]
1.2 数组元素的删除

核心思想:

(假如删除索引为index的元素)

创建一个新数组,长度为原数组长度-1,遍历新数组

在索引小于index时,我们直接将新数组和原数组对应赋值即可

在索引大于index时,我们发现原数组的index+1对应的是新数组,即 newArr[i]=arr[i+1]

代码实现:

import java.util.Arrays;

public class ArrayDelete {
    //数组元素的删除
    public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4};
        System.out.println(Arrays.toString(arr));
        //删除元素的下标/位置
        int index=0;
        //新的数组长度=原数组-1
        int[] newArr=new int[arr.length-1];
        //遍历新数组
        for(int i=0;i=index时,因为index处的元素删除,所以newArr的i对应的arr应当i+1
            else{
                newArr[i]=arr[i+1];
            }
        }
        //替换原数组
        arr=newArr;
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:

[1, 2, 3, 4]
[2, 3, 4]
1.3 面向对象的数组

思想:

将操作数组的一系列方法进行封装,在构造函数中传入数组,调用方法即对数组增删改查

add insert delete set get  等方法

代码:

import java.util.Arrays;

public class MyArray {
    //私有成员变量-数组
    private int[] arr;
    //初始化
    public MyArray(){
        this.arr=new int[0];
    }
    //获取数组长度
    public int getLength(){
        return arr.length;
    }
    //获取数组元素
    public int get(int index){
        if (index < 0 || index >= arr.length) {
            throw new RuntimeException("下表越界");
        }
        return arr[index];
    }
    //修改数组元素
    public int[] set(int index,int element){
        if (index < 0 || index >= arr.length) {
            throw new RuntimeException("下表越界");
        }
        arr[index]=element;
        return arr;
    }
    //打印数组元素
    public void show(){
        System.out.println(Arrays.toString(arr));
    }

    //往数组最后添加元素
    public void add(int element){
        //初始化一个数组
        int[] newArr=new int[arr.length+1];
        for(int i=0;i= arr.length) {
            throw new RuntimeException("下表越界");
        }
        int[] newArr=new int[arr.length+1];
        //遍历数组,将arr除了index位置 其他位置全部复制到newArr
        for(int i=0;i= arr.length) {
            throw new RuntimeException("下表越界");
        }
        //新的数组长度=原数组-1
        int[] newArr = new int[arr.length - 1];
        //遍历原数组将除了index的元素复制到新数组
        for (int i = 0; i < newArr.length; i++) {
            if (i < index) {
                newArr[i] = arr[i];
            } else{
                newArr[i] = arr[i+1];
            }
        }
        //替换原数组
        arr = newArr;
    }
}

测试类

public class MyTest {
    public static void main(String[] args) {
        MyArray myArray = new MyArray();
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);
        myArray.add(5);
        myArray.show();
        System.out.println("第三个元素为:"+myArray.get(2));
        myArray.set(1,1000);
        System.out.println("修改了第2个元素为1000");
        myArray.show();
        System.out.println("数组长度为:"+myArray.getLength());
        //插入元素
        System.out.println("在index为3处插入100");
        myArray.insert(3,100);
        myArray.show();
        //删除元素
        System.out.println("删除索引为4的元素");
        myArray.delete(4);
        myArray.show();
    }
}

结果:

[1, 2, 3, 4, 5]
第三个元素为:3
修改了第2个元素为1000
[1, 1000, 3, 4, 5]
数组长度为:5
在index为3处插入100
[1, 1000, 3, 100, 4, 5]
删除索引为4的元素
[1, 1000, 3, 100, 5]
1.4 查找

以下两个方法可归并到上面的数组方法中

(1)线性查找

代码:

//线性查找
public class Search {
    public static void main(String[] args) {
        //目标数组
        int[] arr=new int[]{1,3,5,7,9};
        //目标元素
        int target=5;
        //目标元素下标,-1表示没有查找到
        int index=-1;
        //遍历数组,找到后终止循环
        for (int i=0;i 

结果:

index:2
二分查找

思想:

(只适用于已经排好序的数组,以从小到大排序举例)

有三个关键的记录值:开始位置begin、中间位置mid、结束位置end

每次目标元素都和中间位置mid元素比较,

​       如果相等,直接返回下标值,结束查找

​       如果大于mid元素则目标元素在mid元素右侧,即调整 begin=mid+1

​       如果小于mid元素则目标元素在mid元素左侧,即调整 end=mid-1

 重复以上步骤(此处可以用循环,也可用递归)

代码:

//二分法查找
public class BinarySearch {
    public static void main(String[] args) {
        //目标数组
        int[] arr=new int[]{1,3,5,7,9,110,123,234,678,1234,12};
        //目标元素 目标元素下标
        int target=1234;
        int index=-1;
        //开始、结束、中间位置
        int begin=0;
        int end=arr.length-1;
        int mid=(begin+end)/2;
        //这里要注意:应该是<= 因为可能begin和end重合时,才找到目标元素
        while(begin<=end){
            //如果相等即找到了元素,保存下标,退出循环
           if(arr[mid]==target){
               index=mid;
               break;
           }else{
               //目标元素小于mid,说明在左侧,end=mid-1
               if(arr[mid]>target){
                   end=mid-1;
               //目标元素大于mid,说明在右侧,begin=mid+1
               }else{
                   begin=mid+1;
               }
               //记得将中间位置元素重新计算
               mid=(begin+end)/2;
           }
        }
        System.out.println("index:"+index);
    }
}

结果:

index:9

好啦!我的第一篇博客到这里就结束啦,感谢你观看到最后。
当作作为记录自己学习的一种方式,
之后还会接着以这种方式来记录自己学习数据结构和算法的过程。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439438.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号