Java数据结构数组

数组

自定义数组类MyOrderArray实现数组的增删改查

public class MyOrderArray {
private long [] arr;  

private int elements; //表示数组的有效数据的个数


public MyOrderArray(){
    arr=new long[50];
    //设置长度为50
}
public MyOrderArray(int maxSize){
    arr=new long[maxSize];
}

### 1. :按照数据的大小,顺序增加

 public void insert(long value){
   int i;
   for(i=0;i<elements;i++){
       if(arr[i]>value){
           break;   //如果arr[i]>value,将arr[i]替换为value,其他数据后移
       }
   }
   for(int j=elements;j>i;j--){     //后移
       arr[j]=arr[j-1];
   }
   arr[i]=value;
   elements++;
}

解析:
- 第一次增加 5, i=0,elements=0,所以for循环并不会执行
- 第二次增加 4, i=0,elements=1,arr[0]>value,此时i=0;break;第二个for循环,elements=1,1>0,将arr[1]设置为5,再将arr[0]设置为4,实现按数据大小顺序添加

其实在代码中可以看出,当第一个for循环执行完,如果没有跳出循环,也就是数组中不存在数大于新增加的值,i的值将等于elements的值,不会执行第二个for循环,所以能实现数据的按大小顺序添加

2. :将对应下标的值删除,下标以后的值都要前移,数组的长度减一

 public void delete(int index){
    if(index>=elements||index<0){   //如果索引的大小超过数组的有效数据的个数
        throw new ArrayIndexOutOfBoundsException();
    }else{
        for(int i=index;i<elements;i++){
            arr[i]=arr[i+1];   //for循环覆盖前一个数据
        }
        elements--;
    }
}

解析:
- 删除先对下标进行判断,如果下标的值大于等于数组已存在数据的个数,也就是elements,将抛出异常
- 删除,用for循环给数组重新赋值,将对应删除下标以后的值前移,数组的有效数据的值建议,下次添加的时候,不会出错。

3.

线性查找

public int search(long value){
    int i;
    for(i=0;i<elements;i++){
        if(arr[i]==value){   //判断arr里是否存在数据
            break;
        }
    }
    if(i==elements){    //如果不存在
        return -1;
    }else{
        return i;
    }
}

线性查找,从开始一直查到最后,直到查出

二分法查找

 public int binarySearch(long value){
    int middle=0;   //中间数的下标
    int low=0;      //最左边
    int pow=elements;   //最右边的数
    while(true){            //死循环
        middle=(pow+low)/2;      //中间数的下标
        if(arr[middle]==value){
            return middle;
        }else if(low>pow){    //查找不到的情况
            return -1;
        }else{
            if(arr[middle]>value){   //中间数大于要查找的数向左查找
                pow=middle-1;
            }else{                  //中间数小于要查找的数向右查找
                low=middle+1;
            }
        }
    }
}

源码:

package com.alg.linear;

public class MyOrderArray {
private long [] arr;  //数组

private int elements; //表示数组的有效数据的个数

public MyOrderArray(){
    arr=new long[50];
    //设置长度为50
}
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;   //如果arr[i]>value,将arr[i]替换为value,其他数据后移
       }
   }
   for(int j=elements;j>i;j--){     //后移
       arr[j]=arr[j-1];
   }
   arr[i]=value;
   elements++;
}
/**
 * 显示数据
 */
public void disPlay(){
    System.out.print("[");
    for(int i=0;i<elements;i++){
        System.out.print(arr[i]+" ");
    }
    System.out.println("]");
    System.out.println(elements);
    System.out.println(arr.length);
}
/**
 * 根据数据查找索引
 */
public int search(long value){
    int i;
    for(i=0;i<elements;i++){
        if(arr[i]==value){   //判断arr里是否存在数据
            break;
        }
    }
    if(i==elements){    //如果不存在
        return -1;
    }else{
        return i;
    }
}
/**
 * 根据索引查找数据
 */
public long get(int index){
    if(index>=elements||index<0){   //如果索引的大小超过数组的长度或者小于0
        throw new ArrayIndexOutOfBoundsException();
    }else{
        return arr[index];       //返回查询结果
    }
}
/**
 * 删除数据  -- 删除数据要把index后一个数据覆盖到index以此类推,并将数组长度减一
 */
public void delete(int index){
    if(index>=elements||index<0){   //如果索引的大小超过数组的长度或者小于0
        throw new ArrayIndexOutOfBoundsException();
    }else{
        for(int i=index;i<elements;i++){
            arr[i]=arr[i+1];   //for循环覆盖前一个数据
        }
        elements--;
    }
}
/**
 * 更新数据
 */
public void change(int index,long value){
    if(index>=elements||index<0){
        throw new ArrayIndexOutOfBoundsException();
    }else{
        arr[index]=value;
    }
}
/**
 * 二分法查找value值对应的下标
 */
public int binarySearch(long value){
    int middle=0;   //中间数
    int low=0;      //最左边
    int pow=elements;   //最右边的数
    while(true){            //死循环
        middle=(pow+low)/2;      //中间数为左边+右边的平均值
        if(arr[middle]==value){
            return middle;
        }else if(low>pow){    //查找不到的情况
            return -1;
        }else{
            if(arr[middle]>value){   //中间数大于要查找的数向左查找
                pow=middle-1;
            }else{                  //中间数小于要查找的数
                low=middle+1;
            }
        }
    }
}
}

测试类:

public class TestMyArray {
public static void main(String[] args) {
   MyOrderArray myOrderArray=new MyOrderArray();
   myOrderArray.insert(0);
   myOrderArray.insert(5);
   myOrderArray.insert(10);
   myOrderArray.insert(9);
    System.out.println(myOrderArray.binarySearch(5));

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值