以下是使用Python实现的几种常见的排序算法:
```
以下是使用Python实现的几种常见的排序算法:
1. 冒泡排序
```python
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
```
2. 选择排序
```python
def selection_sort(arr):
n = len(arr)
for i in range(n):
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]
return arr
```
3. 插入排序
```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]:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
```
4. 快速排序
```python
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)
```
5. 归并排序
```python
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
```
以上是几种常见的排序算法的Python实现。
``
深搜
深度优先搜索(Depth-First Search,DFS)是一种常见的图形搜索算法,它从起点开始,沿着一条路径一直走到底,直到不能再走为止,然后回溯到前一个节点,继续搜索下一条路径,直到找到目标节点或者遍历完整个图。
以下是使用Python实现的深度优先搜索算法:
```python
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start)
for next_node in graph[start] - visited:
dfs(graph, next_node, visited)
return visited
```
其中,`graph`是一个字典,表示图的邻接表,`start`是起点节点,`visited`是已经访问过的节点集合。在每次访问一个节点时,将其加入已访问集合中,并输出该节点。然后遍历该节点的所有邻居节点,如果邻居节点没有被访问过,则递归调用`dfs`函数继续搜索。
使用示例:
```python
graph = {'A': set(['B', 'C']),
'B': set(['A', 'D', 'E']),
'C': set(['A', 'F']),
'D': set(['B']),
'E': set(['B', 'F']),
'F': set(['C', 'E'])}
dfs(graph, 'A')
```
输出结果:
```
A
B
D
E
F
C
```
这表示从起点节点`A`开始,按照深度优先的顺序遍历整个图。
python实现的广度搜索算法、
广度搜索算法(BFS)是一种图形搜索算法,用于遍历或搜索树或图的数据结构。它从根节点开始,
逐层遍历所有节点,直到找到目标节点或遍历完整个图。以下是Python实现的广度搜索算法:
```python
from collections import deque
def bfs(graph, start, end):
# 创建一个队列,用于存储待访问的节点
queue = deque()
# 将起始节点加入队列
queue.append(start)
# 创建一个集合,用于存储已访问的节点
visited = set()
# 循环直到队列为空
while queue:
# 从队列中取出一个节点
node = queue.popleft()
# 如果该节点已经访问过,则跳过
if node in visited:
continue
# 将该节点标记为已访问
visited.add(node)
# 如果找到目标节点,则返回True
if node == end:
return True
# 将该节点的所有邻居加入队列
for neighbor in graph[node]:
queue.append(neighbor)
# 如果队列为空仍未找到目标节点,则返回False
return False
```
在上面的代码中,`graph`是一个字典,表示图的邻接表。`start`和`end`分别是起始节点和目标节点。
算法使用一个队列来存储待访问的节点,使用一个集合来存储已访问的节点。
在每次循环中,从队列中取出一个节点,将其标记为已访问,并将其所有邻居加入队列。
如果找到目标节点,则返回True。如果队列为空仍未找到目标节点,则返回False。
python实现高精度加法
高精度加法是指对于两个非常大的整数进行加法运算,超出了计算机所能表示的范围。
Python中可以使用字符串来表示这些大整数,然后模拟手算的过程进行加法运算。
以下是Python实现的高精度加法:
```python
def add(num1, num2):
# 将两个字符串转换为列表,并翻转
num1 = list(num1)[::-1]
num2 = list(num2)[::-1]
# 计算两个数字的长度
len1 = len(num1)
len2 = len(num2)
# 计算两个数字的最大长度
max_len = max(len1, len2)
# 初始化结果列表和进位
result = []
carry = 0
# 从低位到高位依次相加
for i in range(max_len):
# 取出两个数字的当前位,如果已经超出了数字的长度,则用0代替
digit1 = int(num1[i]) if i < len1 else 0
digit2 = int(num2[i]) if i < len2 else 0
# 计算当前位的和,加上进位
digit_sum = digit1 + digit2 + carry
# 计算当前位的进位
carry = digit_sum // 10
# 将当前位的结果加入结果列表
result.append(str(digit_sum % 10))
# 如果最高位有进位,则将进位加入结果列表
if carry:
result.append(str(carry))
# 将结果列表翻转并转换为字符串
return ''.join(result[::-1])
```
在上面的代码中,`num1`和`num2`分别是两个非常大的整数,使用字符串来表示。首先将这两个字符串转换为列表,并翻转,然后计算两个数字的长度和最大长度。接下来从低位到高位依次相加,取出两个数字的当前位,计算当前位的和,加上进位,计算当前位的进位,将当前位的结果加入结果列表。最后如果最高位有进位,则将进位加入结果列表。
最后将结果列表翻转并转换为字符串,即为两个数字的和。
python实现高精度减法
高精度减法是指对于两个非常大的整数进行减法运算,超出了计算机所能表示的范围。
Python中可以使用字符串来表示这些大整数,然后模拟手算的过程进行减法运算。
以下是Python实现的高精度减法:
```python
def subtract(num1, num2):
# 将两个字符串转换为列表,并翻转
num1 = list(num1)[::-1]
num2 = list(num2)[::-1]
# 计算两个数字的长度
len1 = len(num1)
len2 = len(num2)
# 计算两个数字的最大长度
max_len = max(len1, len2)
# 初始化结果列表和借位
result = []
borrow = 0
# 从低位到高位依次相减
for i in range(max_len):
# 取出两个数字的当前位,如果已经超出了数字的长度,则用0代替
digit1 = int(num1[i]) if i < len1 else 0
digit2 = int(num2[i]) if i < len2 else 0
# 计算当前位的差,减去借位
digit_diff = digit1 - digit2 - borrow
# 如果当前位的差小于0,则需要借位
if digit_diff < 0:
digit_diff += 10
borrow = 1
else:
borrow = 0
# 将当前位的结果加入结果列表
result.append(str(digit_diff))
# 如果最高位有借位,则将借位减去
while result and result[-1] == '0':
result.pop()
if borrow:
result[-1] = str(int(result[-1]) - 1)
# 如果结果列表为空,则说明两个数字相等,返回0
if not result:
return '0'
# 将结果列表翻转并转换为字符串
return ''.join(result[::-1])
```
在上面的代码中,`num1`和`num2`分别是两个非常大的整数,使用字符串来表示。
首先将这两个字符串转换为列表,并翻转,然后计算两个数字的长度和最大长度。
接下来从低位到高位依次相减,取出两个数字的当前位,计算当前位的差,减去借位,
如果当前位的差小于0,则需要借位。
最后如果最高位有借位,则将借位减去。最后将结果列表翻转并转换为字符串,即为两个数字的差。
python实现整数二分算法
整数二分算法是一种常用的搜索算法,用于在有序整数序列中查找目标值。
它的基本思想是将序列分成两部分,判断目标值在哪一部分,然后继续在该部分中进行二分查找,
直到找到目标值或者确定目标值不存在。
以下是Python实现整数二分算法的示例代码:
```python
def binary_search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
```
其中,`nums`是有序整数序列,`target`是要查找的目标值。
算法首先将序列的左右边界分别设置为0和序列长度减1,然后进入循环。
在每次循环中,算法计算序列的中间位置`mid`,并判断目标值与`nums[mid]`的大小关系。
如果相等,则返回`mid`;如果目标值比`nums[mid]`大,则在右半部分继续查找;
如果目标值比`nums[mid]`小,则在左半部分继续查找。如果循环结束时仍未找到目标值,
则返回-1表示目标值不存在。
示例:
```python
nums = [1, 3, 5, 7, 9]
target = 5
print(binary_search(nums, target)) # 输出2
target = 6
print(binary_search(nums, target)) # 输出-1
```
在上面的示例中,`nums`是有序整数序列`[1, 3, 5, 7, 9]`,`target`是要查找的目标值。
第一次调用`binary_search`函数时,算法将序列分成两部分`[1, 3]`和`[7, 9]`,
然后在左半部分中继续查找,最终找到目标值5,返回2。第二次调用`binary_search`函数时,
算法将序列分成两部分`[1, 3, 5]`和`[7, 9]`,然后在右半部分中继续查找,
但是目标值6不存在于序列中,最终返回-1。
python实现浮点数二分算法
浮点数二分算法与整数二分算法类似,但是由于浮点数的精度问题,需要对比较操作进行一些特殊处理。
以下是Python实现浮点数二分算法的示例代码:
```python
def binary_search(nums, target, eps=1e-6):
left, right = 0, len(nums) - 1
while left + eps < right:
mid = (left + right) / 2
if nums[mid] < target:
left = mid
else:
right = mid
if abs(nums[left] - target) < eps:
return left
else:
return -1
```
其中,`nums`是有序浮点数序列,`target`是要查找的目标值,`eps`是比较操作的精度。算法首先将序列的左右边界分别设置为0和序列长度减1,然后进入循环。在每次循环中,算法计算序列的中间位置`mid`,并判断目标值与`nums[mid]`的大小关系。如果目标值比`nums[mid]`大,则在右半部分继续查找;如果目标值比`nums[mid]`小,则在左半部分继续查找。如果循环结束时仍未找到目标值,则返回-1表示目标值不存在。
需要注意的是,在比较浮点数时,由于浮点数的精度问题,不能直接使用`==`或`!=`进行比较,而是需要使用一个精度值`eps`来判断两个浮点数是否相等。在上面的示例代码中,使用`abs(nums[left] - target) < eps`来判断`nums[left]`是否等于`target`。
示例:
```python
nums = [1.0, 2.0, 3.0, 4.0, 5.0]
target = 3.5
print(binary_search(nums, target)) # 输出-1
target = 3.0
print(binary_search(nums, target)) # 输出2
```
在上面的示例中,`nums`是有序浮点数序列`[1.0, 2.0, 3.0, 4.0, 5.0]`,
`target`是要查找的目标值。第一次调用`binary_search`函数时,
算法将序列分成两部分`[3.0, 4.0, 5.0]`和`[1.0, 2.0]`,然后在右半部分中继续查找,
但是目标值3.5不存在于序列中,最终返回-1。第二次调用`binary_search`函数时,
算法将序列分成两部分`[1.0, 2.0, 3.0]`和`[4.0, 5.0]`,
然后在左半部分中继续查找,最终找到目标值3.0,返回2。
python实现高精度乘以低精度
可以使用Python自带的高精度库decimal来实现高精度乘以低精度的运算。
示例代码如下:
```python
from decimal import Decimal
# 高精度数
a = Decimal('12345678901234567890')
# 低精度数
b = 123
# 高精度乘以低精度
c = a * b
print(c) # 输出:1518518518518518518487
```
在上面的代码中,我们使用Decimal将高精度数a转换为Decimal类型,
然后直接用乘法运算符*将其与低精度数b相乘,得到的结果c也是Decimal类型。
需要注意的是,
在使用Decimal时,需要将高精度数用字符串的形式传入,否则可能会出现精度丢失的问题。
python实现高精度除以低精度
可以使用Python自带的高精度库decimal来实现高精度除以低精度的运算。
示例代码如下:
```python
from decimal import Decimal
# 高精度数
a = Decimal('12345678901234567890')
# 低精度数
b = 123
# 高精度除以低精度
c = a / b
print(c) # 输出:100371747707423580.5691056910569105691056911
```
在上面的代码中,我们使用Decimal将高精度数a转换为Decimal类型,
然后直接用除法运算符/将其与低精度数b相除,得到的结果c也是Decimal类型。
需要注意的是,在使用Decimal时,需要将高精度数用字符串的形式传入,
否则可能会出现精度丢失的问题。同时,除数不能为0,否则会抛出ZeroDivisionError异常。
python实现一维前缀和
一维前缀和,也称为前缀和数组,是指一个数组的前缀和序列。
前缀和序列的第i个元素表示原数组中前i个元素的和。
例如,对于数组a=[1, 2, 3, 4, 5],其前缀和序列为prefix_sum=[1, 3, 6, 10, 15]。
Python实现一维前缀和的代码如下:
```python
def prefix_sum(nums):
n = len(nums)
prefix = [0] * (n + 1)
for i in range(1, n + 1):
prefix[i] = prefix[i - 1] + nums[i - 1]
return prefix[1:]
```
在上面的代码中,我们首先定义了一个长度为n+1的前缀和数组prefix,其中prefix[0]=0。
然后,我们遍历原数组nums,计算前缀和数组prefix中的每个元素,最后返回prefix[1:],
即去掉前缀和数组中的第一个元素0。
我们可以使用以下代码测试上述函数:
```python
a = [1, 2, 3, 4, 5]
prefix_sum_a = prefix_sum(a)
print(prefix_sum_a) # 输出:[1, 3, 6, 10, 15]
```
输出结果与预期相符。
python实现二维前缀和
二维前缀和,也称为前缀和数组,是指一个二维数组的前缀和序列。
前缀和序列的第i行第j列元素表示原二维数组中左上角为(0,0),
右下角为(i,j)的矩形区域内所有元素的和。
例如,对于二维数组a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
其前缀和序列为prefix_sum=[[1, 3, 6], [5, 12, 21], [12, 27, 45]]。
Python实现二维前缀和的代码如下:
```python
def prefix_sum(matrix):
m, n = len(matrix), len(matrix[0])
prefix = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
prefix[i][j] = prefix[i - 1][j] + prefix[i][j - 1] - prefix[i - 1][j - 1] + matrix[i - 1][j - 1]
return prefix[1:][1:]
```
在上面的代码中,我们首先定义了一个大小为(m+1)x(n+1)的前缀和数组prefix,
其中prefix[0][:]和prefix[:][0]均为0。然后,我们遍历原二维数组matrix,
计算前缀和数组prefix中的每个元素,最后返回prefix[1:][1:],
即去掉前缀和数组中的第一行和第一列。
我们可以使用以下代码测试上述函数:
```python
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
prefix_sum_a = prefix_sum(a)
print(prefix_sum_a) # 输出:[[1, 3, 6], [5, 12, 21], [12, 27, 45]]
```
输出结果与预期相符。
python实现一维差分
一维差分是指对一个一维数组中相邻元素之间的差值进行计算,得到一个新的一维数组。在Python中,可以使用numpy库中的diff函数来实现一维差分。
示例代码如下:
```python
import numpy as np
# 定义一个一维数组
arr = np.array([1, 3, 5, 7, 9])
# 计算一维差分
diff_arr = np.diff(arr)
print(diff_arr) # 输出 [2 2 2 2]
```
在上面的代码中,我们首先定义了一个一维数组arr,然后使用numpy库中的diff函数对其进行一维差分计算,得到了一个新的一维数组diff_arr。最后,我们将diff_arr输出到控制台上,可以看到其值为[2 2 2 2],即原数组中相邻元素之间的差值都为2。
需要注意的是,numpy库中的diff函数默认计算相邻元素之间的差值,如果需要计算更高阶的差分,可以通过设置n参数来实现。例如,如果需要计算二阶差分,可以将n设置为2,代码如下:
```python
import numpy as np
# 定义一个一维数组
arr = np.array([1, 3, 5, 7, 9])
# 计算二阶差分
diff_arr = np.diff(arr, n=2)
print(diff_arr) # 输出 [0 0 0]
```
在上面的代码中,我们将n参数设置为2,表示计算二阶差分。最终得到的diff_arr数组中,所有元素都为0,这是因为原数组中相邻元素之间的差值都相等,二阶差分结果为0。
python实现二维差分
二维差分是指对一个二维数组中相邻元素之间的差值进行计算,得到一个新的二维数组。在Python中,可以使用numpy库中的gradient函数来实现二维差分。
示例代码如下:
```python
import numpy as np
# 定义一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 计算二维差分
diff_arr = np.gradient(arr)
print(diff_arr[0]) # 输出 [[3. 3. 3.], [3. 3. 3.], [3. 3. 3.]]
print(diff_arr[1]) # 输出 [[1. 1. 1.], [1. 1. 1.], [1. 1. 1.]]
```
在上面的代码中,我们首先定义了一个二维数组arr,
然后使用numpy库中的gradient函数对其进行二维差分计算,
得到了一个新的二维数组diff_arr。
最后,我们将diff_arr的第一个元素和第二个元素分别输出到控制台上,
可以看到其值分别为[[3. 3. 3.], [3. 3. 3.], [3. 3. 3.]]
和[[1. 1. 1.], [1. 1. 1.], [1. 1. 1.]],即原数组中相邻元素之间的差值都为3和1。
需要注意的是,numpy库中的gradient函数默认计算相邻元素之间的差值,
如果需要计算更高阶的差分,可以通过设置edge_order参数来实现。
例如,如果需要计算二阶差分,可以将edge_order设置为2,代码如下:
```python
import numpy as np
# 定义一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 计算二阶差分
diff_arr = np.gradient(arr, edge_order=2)
print(diff_arr[0]) # 输出 [[0. 0. 0.], [0. 0. 0.], [0. 0. 0.]]
print(diff_arr[1]) # 输出 [[0. 0. 0.], [0. 0. 0.], [0. 0. 0.]]
```
在上面的代码中,我们将edge_order参数设置为2,表示计算二阶差分。
最终得到的diff_arr数组中,所有元素都为0,
这是因为原数组中相邻元素之间的差值都相等,二阶差分结果为0。
python实现位运算
Python中的位运算符有以下几种:
1. 按位与(&):两个位都为1时,结果才为1,否则为0。
2. 按位或(|):两个位都为0时,结果才为0,否则为1。
3. 按位异或(^):两个位相同为0,不同为1。
4. 按位取反(~):对每个位取反,0变为1,1变为0。
5. 左移(<<):将二进制数向左移动指定的位数,右边补0。
6. 右移(>>):将二进制数向右移动指定的位数,左边补0或1(取决于原数的符号位)。
下面是一些位运算的示例代码:
# 按位与
a = 0b1010
b = 0b1100
c = a & b
print(bin(c)) # 输出:0b1000
# 按位或
a = 0b1010
b = 0b1100
c = a | b
print(bin(c)) # 输出:0b1110
# 按位异或
a = 0b1010
b = 0b1100
c = a ^ b
print(bin(c)) # 输出:0b0110
# 按位取反
a = 0b1010
b = ~a
print(bin(b)) # 输出:-0b1011
# 左移
a = 0b1010
b = a << 2
print(bin(b)) # 输出:0b101000
# 右移
a = 0b1010
b = a >> 2
print(bin(b)) # 输出:0b10
常用代码模板1——基础算法 - AcWing
Chatgpt在线网页版-永久免费使用! (qdymys.cn)