数组(Array)是一种线性表结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
-
最大的特点:支持随机访问,根据下标随机访问的时间复杂度为O(1)
-
寻址:
a[i]_add = base_add + i * data_type_size
-
数组的插入和删除比较低效
- 插入:如果我们要将数据插入到数组的第K个位置,为了把第K个位置空出来,我们需要将第K~N这部分的数据全部往后挪一位,这个操作的时间复杂度是O(n)
- 删除:如果要删除第K个位置的数据,为了内存的连续性,也要将第K~N位置的数据往前挪一位,时间复杂度也是O(n)
当然,我们可以进行优化,那就是删除数据时并不立即删除,而是记录下已删除的数据。等到数组没有更多空间了,再执行一次真正的删除操作,一次性清理掉所有已删除数据。
数组Java实现
public class myArray {
private int data[];//数据
private int size;//数组大小
private int count;//数组当前大小
/**
*
* @param size
*/
public myArray(int size){
this.data = new int[size];
this.size = size;
this.count = 0;
}
/**
* 删除指定index位置值
* @param index
* @return
*/
public boolean delet(int index){
//index不合法
if(index < 0 || index > count) {
System.out.println("位置不合法!");
return false;
}
//[index+1,count)往前移动一位
for(int i = index +1 ; i < count; i++){
data[i-1] = data[i];
}
count--;
return true;
}
/**
* 将值插入所给下标处
* @param index
* @param value
* @return
*/
public boolean insert(int index, int value){
//index不合法
if(index < 0 || index > count) {
System.out.println("位置不合法!");
return false;
}
//内存空间已满
if(size == count) {
System.out.println("内存空间已满!");
return false;
}
//[index,count)后移一位
for(int i = count; i > index; i--)
data[i] = data[i-1];
data[index] = value;
count ++;
return true;
}
/**
* 将值插入数组最后面
* @param value
* @return
*/
public boolean append(int value){
//内存空间已满
if(size == count) {
System.out.println("内存空间已满!");
return false;
}
data[count++] = value;
return true;
}
/**
* 返回数组字符串
* @return
*/
public String toString(){
StringBuilder builder = new StringBuilder();
for(int i = 0; i < count; i++)
builder.append(data[i] + ",");
return builder.toString();
}
public void arrTest(){
myArray test = new myArray(10);
test.append(1);
System.out.println(test.toString());
test.insert(1,4);
System.out.println(test.toString());
test.delet(0);
System.out.println(test.toString());
}
}