1. 内存工作原理
计算机就想是跟多抽屉的集合,每个抽屉都有地址。
需要将数据存储的内存时,请求计算机提供存储空间,计算机给一个存储地址。
需要存储多项数据时,有两种基本方法——数组和链表。
2. 数组和链表
-
链表
链表中的元素可存储在内存的任何地方
链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起
内存地址是可以是不连续的
- 优点
- 插入删除速度快
- 内存利用率高,不会浪费内存
- 大小没有固定,拓展很灵活
- 缺点
- 不能随机查找,必须从第一个开始遍历,查找效率低
- 优点
-
数组
一组相同数据类型的有序集合
一次分配所有的内存空间
内存地址是连续的
- 优点
- 随机访问性强
- 查找速度快
- 缺点
- 插入和删除效率低
- 可能浪费内存
- 内存空间要求高,必须有足够的连续内存空间
- 数组大小固定,不能动态拓展
- 优点
-
术语
- 元素的位置称为索引
- 索引的值是从0开始的
-
中间插入
- 使用链表最合适
- 只需修改它前面元素指向的地址
- 而用数组,则必须将后面的元素都向后移
- 会出现内存不存
- 使用链表最合适
-
删除
- 使用链表最合适
- 只需修改它前面元素指向的地址
而用数组,则必须将后面的元素都向前移
- 只需修改它前面元素指向的地址
- 使用链表最合适
3. 选用排序
**解决问题:用**来无序元素(数组),排列称有序元素
- 思想:
- 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
- 时间复杂度:
$$
O(n^2)
$$
代码实现
public int[] selectionSort(int[] arr) {
int minIdx;
for (int i = 0; i < arr.length - 1; i++) {
minIdx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIdx]) {
// 寻找更小的元素
minIdx = j;
}
}
// 将找到的最小元素与第一个未排序元素交换
int temp = arr[minIdx];
arr[minIdx] = arr[i];
arr[i] = temp;
}
return arr;
}
4. 小结
- 需要存取对个元素时,可使用数组或链表
- 数组的元素都在一起
- 链表的元素是分开的,其中每一个元素都存储了下一个元素的地址。
- 数组的读取速度快
- 链表的插入和删除速度很快
- 在同一个数组中,所有元素的类型都必须相同