数组和链表

  • 数组在定义时开辟空间,存储的数据少,浪费内存;存储数据满了,新的数据加入会产生转移成本。
  • 数组在插入新元素时,运行时间是 O(n)
  • 链表要访问后面的数据,需要从头开始访问,才能拿到后面数据的地址,若需要跳跃拿取数据,链表的速度慢
  • 在中间插入元素时,链表效率更高,删除元素时,链表是更好的选择,只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。
  • 以坐座位为例,数组是一起坐,链表是分开坐
  • 不同于插入,删除元素总能成功。如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能够将元素删除。
  • 『数组链表』结合的数据结构:如网站存储用户信息时使用该数据结构。这个数组包含26个元素,每个元素都指向一个链表。例如,该数组的第一个元素指向的链表包含所有以A打头的用户名,第二个元素指向的链表包含所有以B打头的用户名,以此类推。

选择排序 - 图1

选择排序 - 图2

选择排序

音乐播放列表中有很多歌曲,要按播放量进行排序。

简单的方法是遍历整个列表,每次找到列表中播放量最多的歌曲,将其放进新的列表,第二次找到播放量第二的歌曲,以此类推。这样的时间复杂度是 O(n*n)(虽然不是每一次都需要查找 n 个元素,但是计算复杂度时是这样的)

acbcfa39gy1g65c3ap57bj20ow0bc0vr.jpg

  1. from typing import List
  2. # 找到最小的元素的索引
  3. def findSmallest(arr: List[int]) -> int:
  4. min_val = arr[0]
  5. for idx, val in enumerate(arr):
  6. if val <= min_val:
  7. min_val = val
  8. smallestIdx = idx
  9. return smallestIdx
  10. # 选择排序
  11. def selectionSort(arr: List[int]) -> List[int]:
  12. newArr = []
  13. for i in range(len(arr)):
  14. idx = findSmallest(arr)
  15. newArr.append(arr[idx])
  16. arr.pop(idx) # 参数是索引
  17. return newArr
  18. selectionSort([5, 4, 3, 8, 5, 8, 1])

总结:

  • 计算机内存犹如一大堆抽屉。
  • 需要存储多个元素时,可使用数组或链表。
  • 数组的元素都在一起。
  • 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。
  • 数组的读取速度很快。
  • 链表的插入和删除速度很快。
  • 在同一个数组中,所有元素的类型都必须相同(都为int、 double等)。