📅  最后修改于: 2023-12-03 15:22:41.878000             🧑  作者: Mango
欢迎来到初学者的算法实践问题套装1。在这个套装里,我们提供了一系列的算法练习,旨在帮助你巩固基本的算法概念和提高你的算法实现技能。下面我们来看看这个问题套装里有哪些练习。
冒泡排序是一种比较简单的排序算法,其基本思想是重复地走访过要排序的数列,每次比较相邻的两个元素,如果顺序错误就交换这两个元素。具体实现请看以下代码片段。
def bubble_sort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# 最后 i 个元素已经排好
for j in range(0, n-i-1):
# 如果当前元素大于下一个元素,交换位置
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
二分查找也被称为折半查找,其基本思想是在有序数组中查找一个指定的元素,从数组中间开始查找,如果中间元素大于目标元素就在左半部分继续查找,否则在右半部分继续查找,直到找到目标元素或者查找结束。具体实现请看以下代码片段。
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
斐波那契数列是一个经典的数学问题,其定义如下:
$ F_0 = 0, F_1 = 1 $
$ F_n = F_{n-1} + F_{n-2} , 其中 n > 1$
具体实现请看以下代码片段。
def fibonacci(n):
if n < 0:
# 输入错误
return -1
elif n == 0 or n == 1:
# 基本情形
return n
else:
# 递归调用
return fibonacci(n-1) + fibonacci(n-2)
最大公约数和最小公倍数是两个与数学有关的问题。最大公约数指的是两个数公共的约数中最大的那个数,最小公倍数指的是两个数公共倍数中最小的那个数。具体实现请看以下代码片段。
# 最大公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a%b)
# 最小公倍数
def lcm(a, b):
return a * b // gcd(a, b)
快速排序是一种高效的排序算法,其基本思想是选择一个枢轴元素,将数组分成左右两部分,左边部分的元素小于枢轴元素,右边部分的元素大于枢轴元素,然后递归地对左右两部分进行快速排序。具体实现请看以下代码片段。
def quick_sort(arr):
if len(arr) <= 1:
# 基本情形
return arr
else:
# 选择枢轴元素
pivot = arr[0]
left, right = [], []
for i in arr[1:]:
if i < pivot:
left.append(i)
else:
right.append(i)
# 递归调用
return quick_sort(left) + [pivot] + quick_sort(right)
以上就是初学者的算法实践问题套装1的练习内容。希望这些练习可以帮助你在算法实现方面有所提高。如果你想继续提高自己的算法实现能力,不妨尝试下面的一些扩展练习。