数据结构与算法----线性结构(数组)

目录

前言

一、数组的基本使用

1、数组的创建

 2、数组元素的添加

3、数组的删除

二、面向对象的数组

三、查找算法

1、线性查找

2、二分法查找


前言

概念:指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作,它是典型的线性结构。

一、数组的基本使用

1、数组的创建

package demo1

public class TestArray{
    
    public static void main(String[] args){
        //创建一个数组
        int[] arr1 = new int[3];
        //获取数组长度
        int length1 = arr1.length;
        System.out.println("数组的长度是:"+length1);
        //访问数组中的元素:数组名[下标]  注意:下标从0开始,最大可以取到长度-1
        int element0 = arr1[0];
        System.out.println("数组的第一个值:"+element0);
        //为数组中的元素赋值
        arr1[0]=99;
        System.out.println("给数组第一个值赋值"+arr1[0]);
        arr1[1]=98;
        arr1[2]=97;
        //遍历数组
        for(int i=0;i<length1;i++){
            System.out.println("数组的第"+i+"元素是:"+arr1[i]);
        }
        //创建数组的同时为数组中的元素赋值
        int[] arr2 = new int[] {90,80,70,60,50};
        //获取数组的长度
        System.out.print("数组的长度:"+arr2.length);
    }
}

 2、数组元素的添加

(1)、解决数组的长度不可变的问题

        思路:
        ·创建一个新的数组,长度是原数组长度+1
        ·把原数组中的数据全部复制到新数组中
        ·把目标元素放到新数组的最后
        ·新数组替换原数组

package demo1

public class TestOpArray{
    
    public static void main(String[] args){
        //解决数组的长度不可变的问题
        int[] arr = new int[] {9,8,7};
        //快速查看数组中的元素
        System.out.println(Arrays.toString(arr));
        //要加入数组的目标元素
        int dst = 6;
        
        //创建一个新的数组,长度是原数组长度+1
        int[] newArr = new int[arr.length+1];
        //把原数组中的数据全部复制到新数组中
        for(int i=0;i<arr.length;i++){
            newArr[i] = arr[i];
        }
        //把目标元素放到新数组的最后
        newArr[arr.length]=dst;
        //新数组替换原数组
        arr=newArr;
        System.out.println(Arrays.toString(arr));
    }
}

3、数组的删除

        思路:

        创建一个新的数组长度是原数组的长度-1
        复制原数组中除了要删除的那个元素以外的其他的元素
        要删除的元素之前的元素
        要删除的元素之后的元素
        新数组替换旧数组

        

package demo1

public class TestOpArray2{
    //如何删除数组中的元素
    public static void main(String[] args){
        //目标数组
        int[] arr = new int[] {9,8,7,6,5,4};
        //要删除的元素的下标
        int dst = 3;

        //创建一个新的数组长度是原数组的长度-1
        int[] newArr = new int[arr.length-1];
        //复制原数组中除了要删除的那个元素以外的其他的元素
        for(int i=0;i<newArr.length;i++){
            //要删除的元素之前的元素
            if(i<dst){
                newArr[i]=arr[i];
            //要删除的元素之后的元素
            }else{
                newArr[i]=arr[i+1];
            }}
        //新数组替换旧数组
        arr=newArr;
        System.out.println(Arrays.toString(arr));
    }
}

二、面向对象的数组

什么是对象:能看到的或者说在程序中可以直接使用的内容称为对象
通过new关键字创建的:类名 对象名=new 类名();

面向对象数组概念:对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组就行了。

 这个圆就是一个对象,里面有数组,还有操作数组的方法。

下面举例说明:

首先创建一个对象:

package demo1.util

public class MyArray{
    
    //用于存储int类型数据的数组
    private int[] elements;
    public MyArray(){
        elements = new int[0];
    }

    //获取数组长度的方法
    public int size(){
        return elements.length;
    }
    
    //往数组的末尾添加一个元素
    public void add(int element){
        //创建一个新的数组
        int[] newArr = new int[elements.length+1];
        //把原数组中的元素复制到新数组中
        for(int i=0;i<elements.length;i++){
            newArr[i]=elemnts[i];
        }
        //把添加的元素放入新数组中
        newArr[elements.length]=element;
        //使用新数组替换旧数组
        elements = newArr;
        
    }

    //打印所有元素到控制台
    public void show(){
      System.out.println(Arrays.toString(elements));
    }

    //删除数组中的元素
    public void delete(int index){
        //判断下标是否越界
        if(index<0 || index>elements.length-1){
            throw new RuntimeException("下标越界");
        }
        //创建一个新的数组,长度为原数组的长度-1
        int[] newArr = new int[elements.length-1];
        //赋值原有数组的新数组
        for(int i=0;i<newArr.length;i++){
            //想要删除的元素前面的元素
            if(i<index){
                newArr[i] = elements[i];
            //想要删除的元素后面的元素
            }else{
                newArr[i]=elements[i+1];
            }
        }
        //新数组替换旧数组
        elements=newArr;
    }

    //获取指定位置元素
    public void get(int index){
        //判断位置是否合法
        if(index<0 || index>elements.length-1){
            throw new RuntimeException("下标越界");
        }
        return elements[index];
    }

    //插入一个元素到指定位置
    punlic void insert(int index,int element){
        //创建一个新的数组
        int[] newArr = new int[elemnts.length+1];
        //将原数组中的元素放入新数组中
        for(int i=0;i<elements.length;i++){
            //目标位置之前的元素
            if(i<index){
                newArr[i] = elements[i];
            }else{
                newArr[i+1] = elements[i];
            }
        }
        //插入新的元素
        newArr[index] = element;
        //新数组替换旧数组
        elements=newArr;
    }

    //替换指定位置的元素
    public void set(int index,int element){
        //判断位置是否合法
        if(index<0 || index>elements.length-1){
            throw new RuntimeException("下标越界");
        }
        elements[index] = element;
    }

    //线性查找
    public int search(int target){
        //遍历数组
        for(int i=0;i<elements.length;i++){
            if(elements[i]==target){
                return i;
            }
        }
        return -1;
    }

    //二分法查找
     public int binarySearch(int target){
        //记录开始位置
        int begin=0;
        //记录结束位置
        int end = elements.length-1;
        //记录中间的位置
        int mid =(begin+end)/2;
        //记录目标位置
        int index=-1;
        //循环查找
        while(true){
            //什么情况下没有这个元素?
            //如果开始位置在结束位置之后或重合。
            if(begin>=end){
                return = -1;
            }
            //判断中间的这个元素是不是要查找的元素
            if(elements[mid]==target){
                return mid;
            //中间这个元素不是要查的元素
            }else{
                //判断中间这个元素是不是比目标元素大
                if(elements[mid]>target){
                    //把结束位置调整到中间位置前一个位置
                    end=mid-1;
                //中间这个元素比目标元素小
                }else{
                    //把开始位置调整到中间位置的后一个位置
                    begin=mid+1;
                }
                //取出新的中间位置
                mid=(begin+end)/2;
            }
        }            
    }  
}

 新创建一个类用于测试:

package demo1

import demo1.util.MyArray;

public class TestMyArray{
    
    public static void main(String[] args){
        //创建一个可变的数组
        MyArray ma = new MyArray();
        //获取长度
        int size = ma.size();
        System.out.println(size) //0
        //添加元素之前调用show方法,数组是空输出[]
        ma.show();
        //往可变数组中添加一个元素
        ma.add(99);
        System.out.println(size) //添加完变成1
        //添加元素后调用show方法,数组是[99]
        ma.show();

        ma.add(97);
        ma.add(98);
        //删除某个元素
        ma.delete(1);
        ma.show();

        //获取某个位置的元素
        System.out.println(ma.get(1))

        //插入元素到指定位置
        ma.add(96);
        ma.add(95);
        ma.add(94);
        ma.show();
        ma.insert(3,33);
        ma.show();
        
        //替换指定位置的元素
        ma.set(0,100);
        ma.show();

        //线性查找
        System.out.println("index:"+ma.search(97));

        //二分法查找
        System.out.println("index:"+ma.binarySearch(97));
    }
}

三、查找算法

1、线性查找

从数组的第0个开始,依次循环取值,与需要查找的值对比,知道找到为止,效率较低。

package demo1

public class TestSearch{
    
    public static void main(String[] args){
        //目标数组
        int[] arr = new int[] {2,3,5,6,7,4,2,10};
        //目标元素
        int target=10;
        //目标元素所在的下标
        int index=-1;
        //遍历数组
        for(int i=0;i<arr.length;i++){
            if(arr[i]==target){
                index=i;
                break;
            }
        }
        //打印目标元素的下标
        System.out.println("index"+index);
    }
}

2、二分法查找

二分法查找:很好理解,就是中间分隔,判断在哪一边。在分隔两份,然后判断在哪一面,依次分隔。但是缺陷是,查找的数组要是有序的。

package demo1

public class TestSearch{
    
    public static void main(String[] args){
        //目标数组
        int[] arr = new int[] {1,2,3,4,5,6,7,8,9};
        //目标元素
        int target=8;
        //记录开始位置
        int begin=0;
        //记录结束位置
        int end = arr.length-1;
        //记录中间的位置
        int mid =(begin+end)/2;
        //记录目标位置
        int index=-1;
        //循环查找
        while(true){
            //判断中间的这个元素是不是要查找的元素
            if(arr[mid]==target){
                index=mid;
                break;
            //中间这个元素不是要查的元素
            }else{
                //判断中间这个元素是不是比目标元素大
                if(arr[mid]>target){
                    //把结束位置调整到中间位置前一个位置
                    end=mid-1;
                //中间这个元素比目标元素小
                }else{
                    //把开始位置调整到中间位置的后一个位置
                    begin=mid+1;
                }
                //取出新的中间位置
                mid=(begin+end)/2
            }
        }
        System.out.println("index:"+index)       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小先生

知识是无价的,白嫖也可以的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值