数组的特点
- 数组中的元素在内存中顺序存储,在逻辑上是顺序表
- 内存是由一个个内存单元组成,每一个内存单元都有自己的地址
- 数组的初始化后,空间大小固定
- 数组的下标从0开始
时间复杂度
- 数组读取元素的方式为随机读取:array[3],与数组的输入规模无关,因此时间复杂度为O(1)
- 数组的更新元素方式:array[3]=10,与数组的输入规模无关,时间复杂度O(1);
- 数组的插入元素,最坏的可能插在数组的头部,整个数组的下标都要后移1,时间复杂度O(n)
- 删除数组的元素,原理同插入元素,时间复杂度为O(n)
数组demo
package com.cc.array;
public class MyArray {
private int [] array;
//数组的实际长度
private int size;
public MyArray(int capacity) {
array=new int[capacity];
size=0;
}
/**
* 数组插入元素
* @param index
* @param element
* @throws Exception
*/
public void insert(int index,int element) throws Exception{
if (index<0||index>size)
throw new IndexOutOfBoundsException("数组下标越界!");
//数组的实际长度大于数组容器的长度,对数组进行扩容
if (size>=array.length)
resize();
//从右向左至插入位置,每个元素向右移动一位
for (int i=size-1;i>=index;i--){
array[i+1]=array[i];
}
//插入位置的元素为当前插入的元素
array[index]=element;
//数组的实际长度加1
size++;
}
/**
* 实现数组的扩容
*/
public void resize(){
//新数组的容器的长度在原来数组容器的长度上*2,实现扩容
int [] newArray =new int[array.length*2];
//数组复制,原数组,原数组复制的起位置,目标数组,目标数组的起始位置,复制的长度
System.arraycopy(array,0,newArray,0,array.length);
//实现长度扩容
array=newArray;
}
/**
* 数组输出
*/
public void out(){
for (int i = 0; i <array.length; i++) {
System.out.println(array[i]);
}
}
/**
* 删除指定位置的元素
* @param index
* @return
*/
public int delete(int index){
if (index<0||index>=size)
throw new IndexOutOfBoundsException("数组下标越界!");
int deleteElement =array[index];
//将后一个元素赋值给钱面一个元素,防止数组越界,i<size-1,因此array[i+1]才不会越界
for(int i=index;i<size-1;i++){
array[i]=array[i+1];
}
//将最后一个元素改为初始值0
array[size-1]=0;
//数组的实际长度减一
size--;
return deleteElement;
}
public static void main(String[] args) throws Exception {
MyArray myArray =new MyArray(4);
myArray.insert(0,1);
myArray.insert(1,2);
myArray.insert(2,3);
myArray.insert(3,4);
myArray.insert(4,25);
// myArray.out();
myArray.delete(1);
myArray.out();
}
}