数组是线性表的一种,接下来介绍基本概念。
一、线性表基础
1.1 线性表
常见的线性表有数组、栈、队列、链表等。
从语言实现角度有两种:
- 一体式:存储表信息和数据都连续放在一起,结构整体性强易管理。;
- 分离式:表对象只保存整个表相关的信息(容量元素个数),元素值存放在另一个存储区内链接。
从存储角度:
- 顺序性:数据存放在固定的一段存储区,例如数组
- 链表型:数据通过物理地址连接,访问必须从头开始访问。例如链表
从访问限制:
栈和队列访问受限,只能在固定的位置进行插入和删除等操作。
从扩容角度:
- 线性增长:每次扩容固定数目存储容量。特点:节省空间,但是扩充操作频繁,操作次数多。
- 每次扩容增加一倍。特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。
1.2 数组
数组有两个需要注意的点,一个是从0开始记录,也就是第一个存元素的位置是a[O]
,最后一个是a[ength-1]
。其次,数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存。
特征:
- 创建的数组元素在java中默认为0,在C中方法外创建为0,方法内创建为很长随机数
- 可初始化部分数组
- 只能从前往后连续空间初始化
二、数组基本操作
2.1 查找
int select(int [] array, int n) {
for (int i = 0; i < array.length; i++) {
if(array[i] == n) return i;
//假设是递增数组,则大于当前元素值就可以退出了。
if(n > array[i]) return -1;
}
return -1;
}
2.2 插入数组元素
void insert(int [] array, int index, int n) {
if(index >= array.length) return;
for(int i = array.length - 1; i >= index; i--) {
array[i + 1] = array[i];
}
array[index] = n;
for(int i = 0; i < array[i]; i++) {
System.out.print(array[i] + "\t");
}
}
2.3 删除
int remove(int [] arr, int size, int key) {
int index = -1;
for(int i = 0; i < size; i++) {
if(arr[i] == key) {
index = i;
break;
}
}
if(index != -1) {
for(int i = index + 1; i < size; i++) {
arr[i - 1] = arr[i];
size--;
}
}
return size;
}