一、链表和数组
链表和数组是常见的数据结构,用于组织和存储数据。它们在内部实现和使用方式上有一些显著的区别。
数组是一个连续的内存块,用于存储相同类型的元素。数组的每个元素通过索引访问,索引从0开始。数组的主要特点包括:
- 随机访问:由于数组的元素在内存中是连续存储的,因此可以通过索引以常量时间(O(1))的复杂度访问任何元素。
- 固定大小:数组的大小在创建时确定,并且通常无法更改。如果需要更多的空间,可能需要创建一个新的更大的数组并将数据复制到新数组中。
链表是由节点组成的集合,每个节点包含数据和指向下一个节点的引用(或指针)。链表的主要特点包括:
- 非连续存储:链表的节点可以在内存中的任意位置,它们通过指针连接起来。这使得链表的插入和删除操作比数组更高效。
- 顺序访问:要访问链表中的元素,需要从头节点开始按顺序遍历链表,直到找到所需的元素。因此,链表的访问时间复杂度是O(n),其中n是链表的长度。
- 动态大小:链表的大小可以根据需要动态增长或缩小,不像数组需要预先定义大小。
链表和数组各有优劣,适用于不同的场景:
- 当需要频繁地进行随机访问,并且已知元素的数量不会变化时,数组是一个较好的选择。
- 当需要频繁地进行插入和删除操作,或者元素数量可能动态变化时,链表更加适合。链表的动态调整大小的能力使得它在需要频繁插入和删除的场景下更具优势。
需要注意的是,数组和链表也有一些变体和扩展,例如动态数组、双向链表、循环链表等,它们根据不同的需求和应用场景提供了更多的功能和灵活性。
链表和数组在常见操作的运行时间上有一些不同。
访问元素:
- 数组:通过索引可以直接访问指定位置的元素,时间复杂度为 O(1)。
- 链表:需要从头节点开始逐个遍历,直到找到目标节点,时间复杂度取决于链表的长度,最坏情况下为 O(n)。
插入和删除元素:
- 数组:插入和删除元素需要移动其他元素以保持连续性,平均情况下需要移动一半的元素,因此时间复杂度为 O(n)。如果在末尾插入或删除元素,时间复杂度为 O(1)。
- 链表:插入和删除元素只需要改变节点的指针,时间复杂度为 O(1),不需要移动其他元素。
综上所述,数组在随机访问和末尾插入/删除操作上更快,而链表在头部插入/删除和元素的顺序性变化较多的情况下更快。选择使用哪种数据结构取决于具体的使用场景和对各种操作的需求。
二、选择排序(含示例代码)
选择排序(Selection Sort)是一种简单的排序算法。它的基本思想是每次从未排序的部分选择最小(或最大)的元素,然后将其与未排序部分的第一个元素交换位置。重复这个过程,直到整个序列排序完成。
选择排序的算法步骤如下:
- 找到未排序部分中的最小元素。
- 将最小元素与未排序部分的第一个元素交换位置。
- 将排序的边界向右移动一个位置,将已排序部分扩大一个元素。
- 重复步骤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:要删除元素的索引位置。如果不指定索引,默认为列表的最后一个元素。
返回值:
- 返回被删除元素的值。
示例如下所示:文章来源:https://www.toymoban.com/news/detail-460350.html
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。文章来源地址https://www.toymoban.com/news/detail-460350.html
到了这里,关于【算法】算法学习二:链表 & 数组 & 选择排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!