数据结构_数组,链表
原创...大约 2 分钟
前言
本文介绍了数组、链表等数据结构。
设定所有排序:小 → 大。
数组
数组(array)是一组具有相同类型元素的集合,用一段连续的内存来保存。使用下标来访问保存的元素,如a[0]
。
数组是一种数据存储结构。
int a[] = new int[10];
数组大小固定,对指定下标元素读写快 O(1),但是查找慢 O(N),删除元素慢 O(N)。
有序数组
在每次插入的时候对元素进行排序,就得到有序数组。
有序数组查找快 O(LogN),但插入慢 O(N),删除元素慢 O(N)。
有序数组插入:
fun insertSort(key: Int) {
if (size >= sortArr.size) {
return
}
if (size == 0) {
sortArr[size++] = key
return
}
var insertIndex = ++size - 1
while (key < sortArr[insertIndex - 1]) {
sortArr[insertIndex] = sortArr[insertIndex - 1]
insertIndex--
if (insertIndex == 0) {
break
}
}
sortArr[insertIndex] = key
}
在有序数组要找到某个元素 t 可以使用二分查找,其思想是:
- 选取一个中间值 n 将当前数组一分为二。
- 如果
t==n
那么查找结束,如果t<n
,那么在右半部分数组查找,否则在左半部分数组查找。 - 重复步骤
1
,2
,直到找到 n 或者数组已经不可再分(不存在 n),结束查找。
二分法查找:
fun dichotomy(array: IntArray, key: Int): Int {
if (array.size < 2) {
return -1
}
var centerIndex = array.size / 2
var centerKey = array[centerIndex]
return when {
key == centerKey -> centerIndex
key < centerKey -> dichotomy(array.copyOfRange(0, centerIndex), key)
else -> dichotomy(array.copyOfRange(centerIndex - 1, array.size), key)
}
}
链表
链表的每个节点除了保存的数据外,还保存着下一个节点的引用next
,最后一个元素中该引用为null
。
链表的大小不固定,查找,删除,插入指定节点都需要 O(N)
链表有以下分类:
单链表 每个节点只有指向下一个节点的引用,链表只保留第一个链节点的引用
first
双向链表 每个节点保存有父节点和子节点的引用。双向链表也可以是双端链表。
双端链表 双端链表保存第一个链节点farst
和最后一个链节点last
的引用。
源码
👉 点这里 查看链表
源码
参考文献
文章标题:《数据结构_数组,链表》
本文地址: https://jixiaoyong.github.io/blog/posts/9a784fe0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!