【算法】算法学习二:链表 & 数组 & 选择排序

一、链表和数组

链表和数组是常见的数据结构,用于组织和存储数据。它们在内部实现和使用方式上有一些显著的区别。

数组是一个连续的内存块,用于存储相同类型的元素。数组的每个元素通过索引访问,索引从0开始。数组的主要特点包括:

  1. 随机访问:由于数组的元素在内存中是连续存储的,因此可以通过索引以常量时间(O(1))的复杂度访问任何元素。
  2. 固定大小:数组的大小在创建时确定,并且通常无法更改。如果需要更多的空间,可能需要创建一个新的更大的数组并将数据复制到新数组中。

链表是由节点组成的集合,每个节点包含数据和指向下一个节点的引用(或指针)。链表的主要特点包括:

  1. 非连续存储:链表的节点可以在内存中的任意位置,它们通过指针连接起来。这使得链表的插入和删除操作比数组更高效。
  2. 顺序访问:要访问链表中的元素,需要从头节点开始按顺序遍历链表,直到找到所需的元素。因此,链表的访问时间复杂度是O(n),其中n是链表的长度。
  3. 动态大小:链表的大小可以根据需要动态增长或缩小,不像数组需要预先定义大小。

链表和数组各有优劣,适用于不同的场景:

  • 当需要频繁地进行随机访问,并且已知元素的数量不会变化时,数组是一个较好的选择。
  • 当需要频繁地进行插入和删除操作,或者元素数量可能动态变化时,链表更加适合。链表的动态调整大小的能力使得它在需要频繁插入和删除的场景下更具优势。

需要注意的是,数组和链表也有一些变体和扩展,例如动态数组、双向链表、循环链表等,它们根据不同的需求和应用场景提供了更多的功能和灵活性。

链表和数组在常见操作的运行时间上有一些不同。

访问元素:

  • 数组:通过索引可以直接访问指定位置的元素,时间复杂度为 O(1)。
  • 链表:需要从头节点开始逐个遍历,直到找到目标节点,时间复杂度取决于链表的长度,最坏情况下为 O(n)。

插入和删除元素:

  • 数组:插入和删除元素需要移动其他元素以保持连续性,平均情况下需要移动一半的元素,因此时间复杂度为 O(n)。如果在末尾插入或删除元素,时间复杂度为 O(1)。
  • 链表:插入和删除元素只需要改变节点的指针,时间复杂度为 O(1),不需要移动其他元素。

综上所述,数组在随机访问和末尾插入/删除操作上更快,而链表在头部插入/删除和元素的顺序性变化较多的情况下更快。选择使用哪种数据结构取决于具体的使用场景和对各种操作的需求。

二、选择排序(含示例代码)

选择排序(Selection Sort)是一种简单的排序算法。它的基本思想是每次从未排序的部分选择最小(或最大)的元素,然后将其与未排序部分的第一个元素交换位置。重复这个过程,直到整个序列排序完成。

选择排序的算法步骤如下:

  1. 找到未排序部分中的最小元素。
  2. 将最小元素与未排序部分的第一个元素交换位置。
  3. 将排序的边界向右移动一个位置,将已排序部分扩大一个元素。
  4. 重复步骤1~3,直到排序完成。

选择排序的时间复杂度是 O(n^2),其中 n 是待排序序列的长度。无论输入数据的初始顺序如何,选择排序都需要进行 n-1 次比较和交换操作。虽然选择排序在简单性和实现上是比较容易的,但对于大规模的数据集来说,效率较低,因此在实际应用中不常使用。

示例代码如下:

def get_small_num(arr):
    small_num = arr[0]
    small_idx = 0
    for i in range(1, len(arr)):
        if arr[i] < small_num:
            small_num = arr[i]
            small_idx = i
    return small_idx

def slection_sort(arr):
    new_arr = []
    for i in range(len(arr)):
        small = get_small_num(arr)
        new_arr.append(arr.pop(small))
    return new_arr

arr = [5, 3, 8, 4, 1, 0, 2]
slection_sort(arr)
  • arr.pop(small) - 从列表 arr 中删除索引为 small 的元素,并返回被删除的元素的值。
  • new_arr.append(…) - 将返回的被删除元素的值追加到列表 new_arr 的末尾。

pop() 函数是用于从列表中删除指定索引位置的元素,并返回该元素的值。

语法:

list.pop(index)

参数:

  • index:要删除元素的索引位置。如果不指定索引,默认为列表的最后一个元素。

返回值:

  • 返回被删除元素的值。

示例如下所示:

my_list = [1, 2, 3, 4, 5]
removed_element = my_list.pop(2)
print(my_list)  # 输出: [1, 2, 4, 5]
print(removed_element)  # 输出: 3

在上面的示例中,pop(2) 删除了列表 my_list 中索引为 2 的元素,即值为 3 的元素。然后,pop() 函数返回被删除的元素值为 3。最后,打印 my_list 结果为 [1, 2, 4, 5],打印 removed_element 结果为 3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值