跳至主要內容

数据结构_数组,链表

JI,XIAOYONG...大约 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 可以使用二分查找,其思想是:

  1. 选取一个中间值 n 将当前数组一分为二。
  2. 如果t==n那么查找结束,如果t<n,那么在右半部分数组查找,否则在左半部分数组查找。
  3. 重复步骤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的引用。

双端链表
双端链表

源码

👉 点这里open in new window 查看链表源码

参考文献

数组--维基百科open in new window

Java 数据结构和算法(第二版)Robert Laforce 计晓云等译open in new window

文章标题:《数据结构_数组,链表》
本文作者: JI,XIAOYONG
发布时间: 2019/01/01 11:19:52 UTC+8
更新时间: 2023/12/30 16:17:02 UTC+8
written by human, not by AI
本文地址: https://jixiaoyong.github.io/blog/posts/9a784fe0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8