11 数据结构的算法之常见的算法

在数据结构的学习中,掌握一些常见的算法至关重要。算法不仅是解决特定问题的方法,也能帮助我们更有效地使用数据结构。接下来,我们将介绍一些常见的算法,包括排序、查找、递归和动态规划等,并配以案例和代码示例,以帮助大家更好地理解这些算法。

1. 排序算法

排序算法是对一组数据进行排列的算法。在数据结构中,排序是一个常见且基本的操作。以下是几种常见的排序算法:

1.1 冒泡排序

冒泡排序是一种简单的排序算法,它通过重复遍历要排序的列表,比较相邻元素并交换它们的顺序,直到没有需要交换的元素为止。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr

# 使用案例
example_arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(example_arr)
print("冒泡排序结果:", sorted_arr)

复杂度分析

  • 时间复杂度: 最坏和平均情况下为 $O(n^2)$,最好情况为 $O(n)$。
  • 空间复杂度: $O(1)$(因为是原地排序)。

1.2 快速排序

快速排序是一种高效的排序算法,它使用分治策略将大的数组分为两个子数组,然后分别对这两个子数组进行排序。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)

# 使用案例
example_arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = quick_sort(example_arr)
print("快速排序结果:", sorted_arr)

复杂度分析

  • 时间复杂度: 最坏情况为 $O(n^2)$,平均和最好情况为 $O(n \log n)$。
  • 空间复杂度: $O(\log n)$(递归栈空间)。

2. 查找算法

查找算法用于在数据结构中定位特定元素。最常用的查找算法有线性查找和二分查找。

2.1 线性查找

线性查找是最简单的查找方法,它逐个检查列表中的每个元素,直到找到目标元素或检查完整个列表。

示例代码

1
2
3
4
5
6
7
8
9
10
11
def linear_search(arr, target):
for index, value in enumerate(arr):
if value == target:
return index
return -1

# 使用案例
example_arr = [64, 34, 25, 12, 22, 11, 90]
target = 22
result = linear_search(example_arr, target)
print("线性查找结果:", result)

复杂度分析

  • 时间复杂度: $O(n)$。
  • 空间复杂度: $O(1)$。

2.2 二分查找

二分查找是一种高效的查找算法,仅在已排序的数组中有效。它通过逐步将查找范围减少一半来实现。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1

# 使用案例
sorted_arr = [11, 12, 22, 25, 34, 64, 90]
target = 22
result = binary_search(sorted_arr, target)
print("二分查找结果:", result)

复杂度分析

  • 时间复杂度: $O(\log n)$。
  • 空间复杂度: $O(1)$(迭代实现)或 $O(\log n)$(递归实现)。

3. 递归算法

递归是一种解决问题的方法,其中一个函数直接或间接地调用自身。经典的递归示例包括斐波那契数列和阶乘。

3.1 斐波那契数列

斐波那契数列的定义是:$F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)$。

示例代码

1
2
3
4
5
6
7
8
9
10
11
def fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)

# 使用案例
n = 10
print("斐波那契数列的第10项:", fibonacci(n))

复杂度分析

  • 时间复杂度: $O(2^n)$(简单递归)。
  • 空间复杂度: $O(n)$(递归调用栈)。

4. 动态规划

动态规划是一种通过将问题分解成子问题来解决复杂问题的方法。它特别适用于那些重复子问题的情形。

4.1 背包问题

背包问题是经典的动态规划问题。给定一些物品,各自的重量和价值,目标是最大化在背包中选取的物品的总价值。

示例代码

def knapsack(values, weights, capacity):
    n = len(values)
    dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(1, capacity + 1):
            if weights[i-1] <= w:
                dp[i][w] = max(dp[i-1][w], dp[i-1][w - weights[i-1]] + values[i-1])
            else:
                dp[i][w] = dp[i-1][w]
    
    return dp[n][capacity]

# 使用案例
values = [60, 100, 120

11 数据结构的算法之常见的算法

https://zglg.work/datastructure-zero/11/

作者

IT教程网(郭震)

发布于

2024-08-11

更新于

2024-08-12

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论