12.广度优先搜索(Breadth-FirstSearch,BFS)
13.深度优先搜索(Depth-FirstSearch,DFS)
程序员常用的算法包括但不限于以下几种:
1)排序算法:
2)搜索算法:
3)动态规划算法4)贪心算法5)分治算法6)图算法:
下面将对每种算法进行详细讲解,并给出一个实例和对应的C语言实现代码。
结合自己近8年对数据结构的研究,我原创了一整套数据结构和算法教程(xiexuewu.github.io),它通俗易懂、不学院派,没有晦涩难懂的学术用语,教程提供了完整、可运行的C语言程序,非常适合有C语言基础、想系统学习数据结构和算法的人。
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
【示例】假设要排序的数组为:[5,3,8,4,2]
步骤:
第一次遍历:比较相邻的两个元素,如果前面的比后面的大,则交换它们。
[3,5,4,2,8]
第二次遍历:继续比较相邻的两个元素并交换。
[3,4,2,5,8]
继续这个过程,直到没有任何一对数字需要比较。C语言实现代码:
这段代码实现了冒泡排序算法,并对示例数组进行了排序。
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
第一次遍历:找到最小的元素2,与第一个元素5交换位置。
[2,3,8,4,5]
第二次遍历:在剩余的元素中找到最小的元素3,与第二个元素3交换位置(即自身)。
以此类推,直到所有元素都排好序。
C语言实现代码:
这段代码实现了选择排序算法,并对示例数组进行了排序。
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
第一次遍历:首先将数组的第一个元素视为有序序列,然后依次将后面的元素插入到有序序列中的适当位置。
[3,5,8,4,2]
继续进行这个过程,直到所有元素都插入到正确的位置。C语言实现代码:
这段代码实现了插入排序算法,并对示例数组进行了排序。
快速排序是一种常用的排序算法,它是一种分治的排序方法。它的工作原理是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
这段代码实现了快速排序算法,并对示例数组进行了排序。
归并排序是一种分治算法,它将待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后将排好序的子数组合并成一个最终的排序数组。
这段代码实现了归并排序算法,并对示例数组进行了排序。
堆排序是一种选择排序,它利用了堆这种数据结构的性质。堆是一个完全二叉树,它可以分为最大堆和最小堆。在堆排序中,我们使用最大堆来进行升序排序。
这段代码实现了堆排序算法,并对示例数组进行了排序。
顺序搜索是一种简单直观的搜索算法,也称为线性搜索。它从数组的第一个元素开始逐个检查,直到找到目标元素或遍历完整个数组。
【示例】假设要在数组[5,3,8,4,2]中搜索元素4。
这段代码实现了顺序搜索算法,并在示例数组中搜索元素4。
二分搜索是一种高效的搜索算法,但它要求待搜索的数组必须是有序的。它通过反复将待搜索区间划分为两部分,并在每次迭代中选择与目标元素相比较的中间元素来减小搜索范围。
【示例】假设要在有序数组[2,3,4,5,8]中搜索元素4。
这段代码实现了二分搜索算法,并在有序数组中搜索元素4。
动态规划是一种通过将问题分解成更小的子问题来解决复杂问题的方法,然后将子问题的解组合起来得到原问题的解。它通常用于解决优化问题,例如最长公共子序列、背包问题等。
最长公共子序列问题是指找到两个序列中的最长公共子序列的长度。子序列是可以通过删除某些元素(包括零个)而不改变其余元标题二素相对位置的序列。
【示例】假设有两个序列"ABCBDAB"和"BDCAB",它们的最长公共子序列是"BCAB",长度为4。
动态规划解法:
这段代码实现了动态规划解法,并计算了两个序列的最长公共子序列的长度。
这只是动态规划的一个例子,该技术还可以应用于许多其他类型的问题。
贪心算法是一种优化算法,它在每一步都选择当前状态下的最优解,而不考虑后续步骤可能导致的影响。尽管贪心算法不能保证获得全局最优解,但它通常能够产生一个接近最优解的解。
找零钱问题是一个经典的贪心算法应用场景。假设有一定数量的不同面额的货币,要找零amount元,如何选择最少数量的硬币?
【示例】假设货币的面额为[1,2,5,10,20,50,100],要找零amount=36元。
贪心算法解法:
这段代码实现了贪心算法解决找零钱问题,并计算了找零36元所需的最少硬币数量。
虽然贪心算法在这个问题中得到了最优解,但并不是所有问题都适合贪心算法。在某些情况下,贪心算法可能会产生次优解或甚至无法得到正确解。因此,在应用贪心算法时,需要仔细考虑问题的特性。
分治法是一种将问题分解成更小的子问题来解决复杂问题的方法,然后将子问题的解合并起来得到原问题的解。它通常涉及三个步骤:分解、解决和合并。
归并排序是一种经典的排序算法,它采用分治法的思想。它将待排序的数组分成两个子数组,分别对子数组进行排序,然后将排好序的子数组合并成一个有序数组。
算法步骤:
【示例】考虑待排序数组[38,27,43,3,9,82,10],使用归并排序进行排序。C语言实现代码:
广度优先搜索是一种用于图和树的遍历或搜索的算法。它从指定的起始顶点开始,逐层遍历图或树的节点,直到找到目标节点为止。
示例:
考虑以下无向图:
0--1/\|2---3--4
假设起始顶点为0,目标顶点为4。使用BFS可以找到从顶点0到顶点4的最短路径。
深度优先搜索是一种用于图和树的遍历或搜索的算法。它从指定的起始顶点开始,沿着一条路径尽可能深地访问图的顶点,直到到达最深的顶点,然后回溯并继续遍历其他路径。
假设起始顶点为0,目标顶点为4。使用DFS可以找到从顶点0到顶点4的路径之一。