算法图解(笔记):第二章

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. 小结

  • 需要存取对个元素时,可使用数组或链表
  • 数组的元素都在一起
  • 链表的元素是分开的,其中每一个元素都存储了下一个元素的地址。
  • 数组的读取速度快
  • 链表的插入和删除速度很快
  • 在同一个数组中,所有元素的类型都必须相同