您现在的位置是:首页 >技术教程 >18 排序算法(冒泡、选择、插入)网站首页技术教程
18 排序算法(冒泡、选择、插入)
简介18 排序算法(冒泡、选择、插入)
目录
排序算法是计算机科学中基础且重要的内容,在数据处理和算法设计里有广泛应用。本文将使用 Python 实现冒泡排序、选择排序和插入排序算法,并分析它们的时间复杂度和空间复杂度。
一、冒泡排序
1.1 算法原理
冒泡排序的基本思想是重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
1.2 Python 实现
python
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]
return arr
# 测试冒泡排序
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("冒泡排序结果:", sorted_arr)
1.3 复杂度分析
- 时间复杂度:最坏和平均情况下为 O(n^2),因为有两层嵌套循环。最好情况下(数组已经有序)为 O(n),当一次遍历没有发生交换时就可以提前结束。
- 空间复杂度:O(1),只需要常数级的额外空间。
互动环节:你能尝试优化冒泡排序算法,让它在数组接近有序时更快吗?
二、选择排序
2.1 算法原理
选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
2.2 Python 实现
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
# 测试选择排序
arr = [64, 25, 12, 22, 11]
sorted_arr = selection_sort(arr)
print("选择排序结果:", sorted_arr)
2.3 复杂度分析
- 时间复杂度:无论数组初始状态如何,都需要进行两层嵌套循环,所以时间复杂度始终为 O(n^2)。
- 空间复杂度:O(1),只需要常数级的额外空间。
互动环节:思考一下选择排序和冒泡排序在什么情况下表现差异较大?
三、插入排序
2.1 算法原理
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
2.2 Python 实现
python
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
# 将大于 key 的元素向后移动
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
# 插入 key 到正确的位置
arr[j + 1] = key
return arr
# 测试插入排序
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("插入排序结果:", sorted_arr)
2.3 复杂度分析
- 时间复杂度:最坏和平均情况下为 O(n^2),最好情况下(数组已经有序)为 O(n),因为只需要进行一次遍历。
- 空间复杂度:O(1),只需要常数级的额外空间。
互动环节:你能结合插入排序的原理,设计一个场景说明它在处理小规模数据时的优势吗?
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。