首页 > 编程语言 >探索编程世界的宝藏:程序员必掌握的20大算法

探索编程世界的宝藏:程序员必掌握的20大算法

时间:2023-08-16 18:05:40浏览次数:32  
标签:arr 20 image 编程 程序员 算法 排序 节点 def


#程序员必须掌握哪些算法?#


文章目录

  • 1 引言
  • 2 冒泡排序算法:编程世界的排序魔法
  • 3 选择排序算法:排序世界的精确挑选器
  • 4 插入排序算法:排序世界的巧妙插珠者
  • 5 快速排序算法:排序世界的分而治之大师
  • 6 归并排序算法:排序世界的合而为一大师
  • 7 堆排序算法:排序世界的二叉堆巨匠
  • 8 计数排序算法:排序世界的数字统计大师
  • 9 基数排序算法:排序世界的位数魔法师
  • 10 深度优先搜索算法:探索图的迷宫穿越之旅
  • 11 广度优先搜索算法:一步一步扩展探索之旅
  • 12 迪杰斯特拉算法:寻找最短路径的探索之旅
  • 13 动态规划算法:优化子问题,实现最优解之旅
  • 14 贪心算法:局部最优解,实现整体最优解之旅
  • 15 K最近邻算法:基于相似度,探索最邻近之路
  • 16 随机森林算法:决策的集体智慧,探索随机生长之旅
  • 17 红黑树算法:平衡与效率的结合,探索数据结构的奇妙之旅
  • 18 哈希表算法:快速查找的魔法盒,探索数据存储的黑科技之旅
  • 19 图像处理算法:探索美丽的像素世界,解锁视觉奇迹的秘密
  • 20 文本处理算法:解密字母的魔法舞蹈,探索文本分析的奥秘
  • 21 图像识别算法:走进视觉智能的世界,掌握图像分类和目标检测的奥秘
  • 22 结语



探索编程世界的宝藏:程序员必掌握的20大算法_知识

1 引言

在当今数字化时代,程序员们仍然需要拥有一把解决问题和优化代码的金钥匙。这些钥匙是算法,它们隐藏在计算机科学的宝藏中,等待着我们去发现和掌握。本篇博文将带你踏上一段引人入胜的探险之旅,揭开程序员必须掌握的20大算法的神秘面纱。从冒泡排序到深度优先搜索,我们将一起探索这些算法的原理、应用场景,为你的学习之旅增添乐趣和激励。

2 冒泡排序算法:编程世界的排序魔法

冒泡排序算法的基本思想是:将待排序的元素按照大小进行比较,较大的元素逐渐“浮”到列表的末尾,而较小的元素逐渐“沉”到列表的开头。通过多次遍历和交换操作,直到整个列表按照升序排列为止。虽然冒泡排序的性能不如一些高级排序算法,但它直观易懂,是学习排序算法的入门必备。

以下是Python代码示例,展示了冒泡排序算法的实现过程:

def bubble_sort(arr):
    n = len(arr)
    
    for i in range(n - 1):
        for j in range(0, n - i - 1):
            # 比较相邻的元素
            if arr[j] > arr[j + 1]:
                # 交换元素位置
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到冒泡排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

冒泡排序算法或许简单,但它的思想对于理解其他高级排序算法以及算法设计的基本原理非常重要。

3 选择排序算法:排序世界的精确挑选器

选择排序算法的思想非常直观:从待排序的序列中选择最小的元素,并将其放置在序列的起始位置。然后,在剩余的未排序部分中继续选择最小的元素,不断将其放置在已排序部分的末尾。经过多次遍历和交换操作,直到整个序列按照升序排列为止。

以下是Python代码示例,展示了选择排序算法的实现过程:

def selection_sort(arr):
    n = len(arr)
    
    for i in range(n - 1):
        min_idx = i
        for j in range(i + 1, n):
            # 找到未排序部分中的最小元素的索引
            if arr[j] < arr[min_idx]:
                min_idx = j
        
        # 将最小元素与当前位置进行交换
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到选择排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

选择排序算法不仅简单易懂,而且具有较好的性能。尽管它的时间复杂度为 O(n^2),但在某些情况下,它的性能可能比其他高级排序算法更好。

4 插入排序算法:排序世界的巧妙插珠者

插入排序算法的思想非常巧妙:它将待排序的元素逐个插入到已排序序列的正确位置中。通过不断地比较和交换操作,使得整个序列逐步有序。

以下是Python代码示例,展示了插入排序算法的实现过程:

def insertion_sort(arr):
    n = len(arr)
    
    for i in range(1, n):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            # 将大于key的元素后移
            arr[j + 1] = arr[j]
            j -= 1
        
        # 插入key到正确位置
        arr[j + 1] = key

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到插入排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

插入排序算法不仅实现简单,而且适用于小型或部分有序的列表。虽然它的平均和最坏情况下的时间复杂度为O(n^2),但在某些情况下,它的性能可能优于其他高级排序算法。

5 快速排序算法:排序世界的分而治之大师

快速排序算法的核心思想是通过选择一个基准元素,将序列分为比基准元素小的一侧和比基准元素大的一侧,然后递归地对两侧的子序列进行排序。

以下是Python代码示例,展示了快速排序算法的实现过程:

def quick_sort(arr, low, high):
    if low < high:
        # 划分序列
        partition_index = partition(arr, low, high)
        
        # 分别对左右子序列进行快速排序
        quick_sort(arr, low, partition_index - 1)
        quick_sort(arr, partition_index + 1, high)
        

def partition(arr, low, high):
    pivot = arr[high]  # 选择最后一个元素作为基准
    i = low - 1  # 指向小于基准的子序列的末尾索引
    
    for j in range(low, high):
        if arr[j] < pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
quick_sort(arr, 0, len(arr) - 1)
print("排序结果:", arr)

通过运行以上代码,你可以看到快速排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

快速排序算法以其高效的平均时间复杂度 O(nlogn) 而被广泛应用。它采用了分治策略,递归地将列表分成更小的子序列,然后通过比较和交换操作将其排序。

6 归并排序算法:排序世界的合而为一大师

归并排序算法的核心思想是将待排序的序列分成两个子序列,不断重复这个过程,直到子序列长度为1。然后,通过合并两个有序的子序列逐步构建有序的结果序列。

以下是Python代码示例,展示了归并排序算法的实现过程:

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_half = arr[:mid]
        right_half = arr[mid:]
        
        merge_sort(left_half)
        merge_sort(right_half)
        
        merge(arr, left_half, right_half)

def merge(arr, left_half, right_half):
    i = j = k = 0
    
    while i < len(left_half) and j < len(right_half):
        if left_half[i] < right_half[j]:
            arr[k] = left_half[i]
            i += 1
        else:
            arr[k] = right_half[j]
            j += 1
        k += 1
    
    while i < len(left_half):
        arr[k] = left_half[i]
        i += 1
        k += 1
    
    while j < len(right_half):
        arr[k] = right_half[j]
        j += 1
        k += 1

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
merge_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到归并排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

归并排序算法以其稳定的时间复杂度 O(nlogn) 和可靠的性能而受到广泛应用。它通过将序列递归地分成两个子序列,然后将这些子序列合并为一个有序的结果序列。

7 堆排序算法:排序世界的二叉堆巨匠

堆排序算法的核心思想是通过构建一个最大堆或最小堆来实现排序。最大堆是一种二叉树结构,每个父节点的值都大于或等于其子节点的值;最小堆则相反,每个父节点的值都小于或等于其子节点的值。通过不断交换根节点和最后一个节点,并对剩余节点进行堆化操作,堆排序算法可以得到一个有序的结果序列。

以下是Python代码示例,展示了堆排序算法的实现过程:

def heap_sort(arr):
    n = len(arr)
    
    # 构建最大堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)
    
    # 依次提取根节点(最大值)并进行堆化操作
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2
    
    if left < n and arr[left] > arr[largest]:
        largest = left
    
    if right < n and arr[right] > arr[largest]:
        largest = right
    
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
heap_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到堆排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

堆排序算法以其稳定的平均时间复杂度 O(nlogn) 而被广泛应用。它利用二叉堆的特性,不断交换根节点和最后一个节点,对剩余节点进行堆化操作,从而实现排序。

8 计数排序算法:排序世界的数字统计大师

计数排序算法的核心思想是通过先统计序列中每个元素出现的次数,然后根据这些统计信息将元素按照顺序重新排列。它适用于非负整数的排序,且时间复杂度为O(n+k),其中n是序列的长度,k是序列中出现的最大值。

以下是Python代码示例,展示了计数排序算法的实现过程:

def counting_sort(arr):
    max_value = max(arr)
    count = [0] * (max_value + 1)
    result = [0] * len(arr)
    
    # 统计每个元素出现的次数
    for num in arr:
        count[num] += 1
    
    # 计算每个元素在排序后的序列中的位置
    for i in range(1, max_value + 1):
        count[i] += count[i - 1]
    
    # 构建排序后的序列
    for num in arr:
        result[count[num] - 1] = num
        count[num] -= 1
    
    return result

# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = counting_sort(arr)
print("排序结果:", sorted_arr)

通过运行以上代码,你可以看到计数排序算法将列表 [64, 34, 25, 12, 22, 11, 90] 按照升序排列后的结果。

计数排序算法以其线性时间复杂度和稳定性而受到广泛应用。它通过统计序列中每个元素的出现次数,并利用这些统计信息构建有序结果序列。

9 基数排序算法:排序世界的位数魔法师

基数排序算法的核心思想是从低位到高位对待排序的元素进行排序。它利用了数字的位数特性,通过多次分配和收集的过程,最终可以得到一个有序的结果。基数排序算法适用于元素为非负整数的排序,且时间复杂度为O(d * (n + k)),其中d是数字的位数,n是序列的长度,k是每个位的取值范围。
以下是Python代码示例,展示了基数排序算法的实现过程:

def counting_sort(arr, exp):
    n = len(arr)
    count = [0] * 10
    result = [0] * n
    
    # 统计每个位上的出现次数
    for i in range(n):
        index = arr[i] // exp
        count[index % 10] += 1
    
    # 计算每个位上元素的位置
    for i in range(1, 10):
        count[i] += count[i - 1]
    
    # 构建排序后的序列
    for i in range(n - 1, -1, -1):
        index = arr[i] // exp
        result[count[index % 10] - 1] = arr[i]
        count[index % 10] -= 1
    
    # 更新原序列
    for i in range(n):
        arr[i] = result[i]

def radix_sort(arr):
    max_value = max(arr)
    exp = 1
    
    # 从低位到高位依次进行排序
    while max_value // exp > 0:
        counting_sort(arr, exp)
        exp *= 10

# 测试
arr = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(arr)
print("排序结果:", arr)

通过运行以上代码,你可以看到基数排序算法将列表 [170, 45, 75, 90, 802, 24, 2, 66] 按照升序排列后的结果。

基数排序算法以其高效的时间复杂度和稳定性而受到广泛应用。它利用数字的位数特性,通过多次分配和收集的过程实现排序。

10 深度优先搜索算法:探索图的迷宫穿越之旅

深度优先搜索算法的核心思想是通过递归地探索图的所有可能路径,直到找到目标节点或无法继续前进为止。它通过深入搜索图的每个分支,直到无法再继续为止,然后回溯到上一个节点,继续搜索其他未探索的分支。深度优先搜索常用于解决迷宫问题、图遍历和连通性问题等。

以下是Python代码示例,展示了深度优先搜索算法的实现过程:

def dfs(graph, start, visited):
    # 标记当前节点为已访问
    visited.add(start)
    print(start, end=" ")
    
    # 递归地遍历当前节点的邻接节点
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

# 创建图的邻接列表表示
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}
visited = set()

# 从节点'A'开始进行深度优先搜索
dfs(graph, 'A', visited)

通过运行以上代码,你可以看到从节点’A’出发进行深度优先搜索的结果。

深度优先搜索算法以其简单、灵活和可变化的特性而受到广泛应用。它通过递归地探索图的所有可能路径,可以解决许多与图相关的问题。

11 广度优先搜索算法:一步一步扩展探索之旅

广度优先搜索算法的核心思想是利用队列数据结构,逐层扩展搜索目标节点周围的节点。它从起始节点开始,按照距离起始节点的层级顺序逐层探索,并在每一层按照从左到右的顺序对节点进行访问。广度优先搜索常用于解决最短路径问题、连通性问题和寻找图中特定节点等。

以下是Python代码示例,展示了广度优先搜索算法的实现过程:

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    
    while queue:
        node = queue.popleft()
        if node not in visited:
            print(node, end=" ")
            visited.add(node)
            queue.extend(graph[node])

# 创建图的邻接列表表示
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

# 从节点'A'开始进行广度优先搜索
bfs(graph, 'A')

通过运行以上代码,你可以看到从节点’A’出发进行广度优先搜索的结果。

广度优先搜索算法以其逐层扩展和广泛探索的特性而受到广泛应用。它利用队列数据结构,逐层扩展搜索目标节点周围的节点,可以解决许多与图相关的问题。

12 迪杰斯特拉算法:寻找最短路径的探索之旅

迪杰斯特拉算法(Dijkstra’s Algorithm)是一种常用且高效的图算法,用于在带权重的图中寻找从起始节点到目标节点的最短路径。本篇博文将详细介绍迪杰斯特拉算法的原理和实现方法,并提供Python代码,带你一起踏上最短路径的探索之旅。

迪杰斯特拉算法的核心思想是通过启发式的贪心策略,逐步更新起始节点到其他节点的最短距离,并逐步确定最短路径。它维护一个距离表,记录每个节点到起始节点的当前最短距离,并使用优先级队列来选择下一个要扩展的节点。迪杰斯特拉算法常用于路由选择、网络优化和资源分配等问题。

以下是Python代码示例,展示了迪杰斯特拉算法的实现过程:

import heapq

def dijkstra(graph, start):
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    queue = [(0, start)]
    
    while queue:
        current_distance, current_node = heapq.heappop(queue)
        
        if current_distance > distances[current_node]:
            continue
        
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(queue, (distance, neighbor))
    
    return distances

# 创建图的邻接字典表示(使用邻接矩阵也可)
graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'A': 5, 'D': 1, 'E': 6},
    'C': {'A': 2, 'F': 8},
    'D': {'B': 1},
    'E': {'B': 6, 'F': 3},
    'F': {'C': 8, 'E': 3}
}

# 从节点'A'开始使用迪杰斯特拉算法寻找最短路径
start_node = 'A'
shortest_distances = dijkstra(graph, start_node)

# 输出最短路径结果
for node, distance in shortest_distances.items():
    print(f"The shortest distance from {start_node} to {node} is {distance}")

通过运行以上代码,你可以得到从起始节点’A’到其他节点的最短距离结果。

迪杰斯特拉算法以其高效且准确的特性而受到广泛应用。它利用启发式的贪心策略逐步更新最短距离,并逐步确定最短路径。

13 动态规划算法:优化子问题,实现最优解之旅

动态规划(Dynamic Programming)算法是一种常用且强大的算法技术,用于解决具有重叠子问题性质的优化问题。动态规划的关键思想是将一个大问题分解为多个重叠子问题,并保存子问题的解,以避免重复计算。通过自底向上或自顶向下的方式,动态规划算法逐步求解子问题,最终得到问题的最优解。动态规划广泛应用于求解背包问题、路径计数问题、最长公共子序列问题以及其他许多复杂的优化问题。

以下是Python代码示例,展示了动态规划算法的实现过程:

def fibonacci(n):
    fib = [0, 1]
    
    for i in range(2, n+1):
        fib.append(fib[i-1] + fib[i-2])
    
    return fib[n]

# 计算斐波那契数列的第10个数
n = 10
result = fibonacci(n)

print(f"The Fibonacci number at index {n} is {result}")

通过运行以上代码,你可以得到斐波那契数列中第10个数的结果。

动态规划算法通过优化子问题的求解,实现了高效的最优解求解过程。它将一个大问题分解为多个重叠子问题,并使用存储技术避免重复计算,从而提高算法的效率。

标签:arr,20,image,编程,程序员,算法,排序,节点,def
From: https://blog.51cto.com/u_15229916/7111621

相关文章

  • 七大常用编程范式!看看你知道几个?
    一、编程范式是什么?编程范式是程序设计的一种基本方法和规范,它代表了特定编程语言的独特风格和方法。作为一种策略,编程范式帮助程序员解决各种计算问题,其选择可以优化代码的可读性、可维护性和可扩展性。常见的编程范式包括面向对象、函数式和逻辑式等,每种范式都有其独特的理念和......
  • go语言:并发编程
    引言在C/C++中,高并发场景一般使用多线程支持;而go语言天然支持高并发。go语言采用goroutine来支持高并发场景,goroutine有官方实现的用户态的超级“线程池”,每个协程4-5KB栈内存占用并且实现机制大幅减少创建和销毁开销是go语言高并发的根本原因。OS线程(操作系统线程)一般都有固定......
  • Python学习日记 2023年8月16日
    fromseleniumimportwebdriver##pipinstallseleniumfromtimeimportsleepimportcsvf=open('口红1.csv',mode='a',encoding='utf-8',newline='')#csv.DictWriter字典写入csv_writer=csv.DictWriter(f,fieldnames=[......
  • 2023.08.12 codeforces round 893 div2
    年轻人的第四场div2rank:8217solved:2ratingchange:+31newrating:1354A.Buttons题意:给定a,b,c三种按钮的数量,a按钮只能被Anna按,b按钮只能被Katie按,两个人都可以按c按钮,最后没有按钮可以按的人输,Anna先手,问谁是赢家;两个人肯定优先按c按钮,且Anna是先手,只需比较两人能按的按......
  • 澎峰科技|邀您关注2023 RISC-V中国峰会!
     峰会概览 2023RISC-V中国峰会(RISC-VSummitChina2023)将于8月23日至25日在北京香格里拉饭店举行。本届峰会将以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本届峰会采用“主会议+技术研讨会+展览展示+同期活动”的方式,预......
  • P2073题解
    链接:P2073送花题意:有若干朵花,每个有两个属性(美丽值和价格)。你需要维护\(3\)种操作:1.添加一朵花(如果之前有价格相同的忽略此操作)2.删除最贵的花3.删除最便宜的花最后输出两个数:美丽值的总和和价格总和解法:经典的平衡树题。对于第一种操作,关键在于判重。先询问一下有......
  • 沃通CA荣获 ISO9001、ISO20000、ISO27001 等多项国际ISO体系认证
    近年来,沃通CA先后荣获《ISO9001质量管理体系认证证书》、《ISO20000信息技术服务管理体系认证证书》、《ISO27001信息安全管理体系认证证书》等多项国际ISO体系认证证书,充分体现沃通CA在产品质量、信息技术服务、信息安全等方面具备符合国际标准的管理能力及持续的竞争力。国际ISO......
  • 20天 hot 100 速通计划-day10
    二叉树114.二叉树展开为链表给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。示例1:输入:root=[1,2,5,3,4,null......
  • vite打包报错:ERROR: Top-level await is not available in the configured target env
    在开发时,vita打包报错如下: 原因:ECMAScript提案Top-levelawait由MylesBorins提出,它可以让你在模块的最高层中使用await操作符。在这之前,你只能通过在async函数或asyncgenerators中使用await操作符。Top-levelawait是个新特性,打包不支持此特性。解决方案:1.......
  • Autodesk Navisworks Manage 2024 (建筑工程项目模拟和协作软件)中文永久使用
    AutodeskNavisworksManage2024是一款强大的协同项目管理软件,旨在帮助建筑、工程和施工行业的专业人士更高效地进行项目协调和冲突检测。下面将详细介绍NavisworksManage2024的功能和特点。点击获取AutodeskNavisworksManage2024 模拟和可视化:NavisworksManage......