顺序表的插入和删除数组的增删改查和二分查找

Posted 贰零一八

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表的插入和删除数组的增删改查和二分查找相关的知识,希望对你有一定的参考价值。

1.顺序表的表示

为实现顺序表的操作,首先要将其表示出来,用同数据类型的数组和表示数组的长度的整型变量表示。

public class LineList{
    private int[] data;
    private int length;
    public LineList(){

    }
    public void setData(int[] data){
        this.data=data;
    }
    public void setLength(int length){
        this.length=length;
    }
    public int[] getData(){
        return (this.data);
    }
    public int getLength(){
        return (this.length);
    }
}
2.插入操作和程序实现
方法:由后至前将元素向后移动
例如:插入一个值为a的整型元素
public class LineList{
    private int[] data;
    private int length;
    public LineList(){

    }
    public void setData(int[] data){
        this.data=data;//回忆this的用法
    }
    public void setLength(int length){
        this.length=length;
    }
    public int[] getData(){
        return (this.data);
    }
    public int getLength(){
        return (this.length);
    }
}
public boolean insert(int i, int a){//位置和元素的定义
    int j;//表长度
    if (length>=data.length) {
        System.out.println("this table is overflow.");
        return false;
    }//判断表长度的,是否溢出
    if (i<0 || i>length) {
        System.out.println("this is position mistake."+i);
        return false;

    }//元素的位置要在表之内,不可以在没有元素的位置,比如中间断开的情况
    for (j=length-1;j>=i; j--) {
        data[j+1]=data[j];//??
        data[i]=a;
        length ++;//??
        return true;
    }
}

数组的定义、初始化、赋值

public class TestArray{
    public static void main(String[] args) {
        long[] arr=new long[] {2,3,4};
        //定义、初始化、赋值
        arr[0]=1;
        //如果数组已经有了值了,则以有的值为主,且将原值覆盖
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //System.out.println(arr[3]);越界了,因为数组的长度是3

    }
}

面向对象编程方式

一、使用自定义类封装数组

 

 

//后期有必要,再做一下题目,巩固一下,

//你只是看着视频理解了一下

//敲了一下

MyArray{
    //封装一个数组
    private long[] arr;//(1)
    //有效数据的长度
    private int elements;
    //初始化为0,所以可以不用赋值,其实是在测试类中插入元素个数来确定的

    public MyArray(){
        arr=new long[50];//为(1)

    }
    public MyArray(int maxsize){
        arr=new long[maxsize];
    }
    //算是一个重载

    /*插入数据*/
    public void insert(long value){
        arr[elements]=value;
        elements++;
    }

    //显示数据  查一下API,display和insert是API里面应该有的,包装而成的
    /*当然也可能是自定义的,只是一个名称,真正的功能是函数体来实现的*/
    public void display(){
        System.out.print("[");
        for (int i=0;i<elements;i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.print("]");

    }

    /*用for循环来遍历,得到元素对应的索引号*/
    public int search(long value){
        int i;
        for (i=0;i<elements;i++) {
        if (value==arr[i]) {
                break;    
        }
        }
        if (i==elements) {
            return -1;
            //此时已经到了最后一个,还搜索不到的话则表示不存在,此时显示-1
            //看完一小节后,尝试着默一下,不要完全对着敲,效果不好。
        }
        else{
            return i;
        }
    }

    /*查找数据,根据索引来查*/
    public long get(int index){
        if (index>=elements||index<0) {
          throw new ArrayIndexOutofBoundsException();  
        }else{
            return arr[index];
        }
    }

    /*删除数据,即被删除的元素被覆盖,且有效长度减1*/
    public void delete(int index){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            for (int i=index;i<elements;i++) {
              arr[index]=arr[index+1];
              //把后面的元素前移位  
            }
            elements--; 
            
        }
    }
    
    public void change(int index,int newvalue){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            arr[index]=newvalue;
        }

    }
    
}
//后期有必要,再做一下题目,巩固一下,
//你只是看着视频理解了一下
//敲了一下
MyOrderArray{//修改添加方法,变成顺序插入数组
    //封装一个数组
    private long[] arr;//(1)
    //有效数据的长度
    private int elements;
    //初始化为0,所以可以不用赋值,其实是在测试类中插入元素个数来确定的

    public MyOrderArray(){
        arr=new long[50];//为(1)

    }
    public MyOrderArray(int maxsize){
        arr=new long[maxsize];
    }
    //算是一个重载

    //插入数据,顺序插入,如何顺序插入?必须由小到大
    public void insert(long value){
        int i;
        for(i=0;i<elements;i++){
            if (arr[i]>value) {
                break;
            }
        }for (int j=elements;j>i;j--) {
           arr[j]=arr[j-1]; 
        }//元素后移,且加一
        arr[i]=value;
        elements++;
    }

    //显示数据  查一下API,display和insert是API里面应该有的,包装而成的
    //当然也可能是自定义的,只是一个名称,真正的功能是函数体来实现的
    public void display(){
        System.out.print("[");
        for (int i=0;i<elements;i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.print("]");

    }

    //用for循环来遍历,得到元素对应的索引号
    public int search(long value){
        int i;
        for (i=0;i<elements;i++) {
        if (value==arr[i]) {
                break;    
        }
        }
        if (i==elements) {
            return -1;
            //此时已经到了最后一个,还搜索不到的话则表示不存在,此时显示-1
            //看完一小节后,尝试着默一下,不要完全对着敲,效果不好。
        }
        else{
            return i;
        }
    }

    //查找数据,根据索引来查
    public long get(int index){
        if (index>=elements||index<0) {
          throw new ArrayIndexOutofBoundsException();  
        }else{
            return arr[index];
        }
    }

    //线性查找和二分法查找(前提:顺序数组,从小到大,但问题是这个好像没有对其从小到大排序,且没有判断啊??)
    public int binarySeach(long value){
        int middle=0;//中间的值
        int low=0;//最左边的值
        int pow=elements;

        //为什么最大的等于有效数据elements??它表示有效数据的长度,而不是最大值啊??
        while(true){
            middle=(pow+low)/2;
            if(arr[middle]==value){
                return middle;
            }else if (low>pow) {
                return -1;
                //则表示不合理的
            }else{
                if(arr[middle]>value){
                    low=middle-1;
                    //往左边查找,这好像是以下标的方式为索引
                }else{
                    low=middle+1;
                    //往右查找
                }

            }
        }
    }

    //删除数据,即被删除的元素被覆盖,且有效长度减1
    public void delete(int index){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            for (int i=index;i<elements;i++) {
              arr[index]=arr[index+1];
              //把后面的元素前移位  
            }
            elements--; 
            
        }
    }
    
    public void change(int index,int newvalue){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            arr[index]=newvalue;
        }


    }
    
}


public class TestMyArray{
    public static void main(String[] args) {
        MyArray arr=new MyArray();
        arr.insert(13);//索引号0
        arr.insert(34);//索引号1
        arr.insert(90);//索引号2

        arr.display();
        System.out.println(arr.seach(34));
        System.out.println(arr.get(1));
        arr.delete(1);
        arr.display();
        arr.change(0,12);

        /*
        MyOrderArray arr=new MyOrderArray();
        arr.insert(90);
        arr.insert(30);
        arr.insert(80);
        arr.display();
        System.out.println(arr.binarySeach(90));
        */
    }

}
//运行结果
//[13 34 90]
//1
//34
//[13 90]

 

以上是关于顺序表的插入和删除数组的增删改查和二分查找的主要内容,如果未能解决你的问题,请参考以下文章

算法基础之数组的增删改查和双指针思想的妙用

算法基础之数组的增删改查和双指针思想的妙用

算法基础之数组的增删改查和双指针思想的妙用

【JPA】联表的增删改查(一)many to many

用SpringBoot+MySql+JPA实现对数据库的增删改查和分页

ci框架的增删改查和重定向