您现在的位置是:首页 >技术教程 >18 排序算法(冒泡、选择、插入)网站首页技术教程

18 排序算法(冒泡、选择、插入)

Ctrl+C 和 Ctrl+V 的搬运工 2025-07-30 00:01:04
简介18 排序算法(冒泡、选择、插入)

目录

一、冒泡排序

1.1 算法原理

1.2 Python 实现

1.3 复杂度分析

二、选择排序

2.1 算法原理

2.2 Python 实现

2.3 复杂度分析

三、插入排序

2.1 算法原理

2.2 Python 实现

2.3 复杂度分析


排序算法是计算机科学中基础且重要的内容,在数据处理和算法设计里有广泛应用。本文将使用 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),只需要常数级的额外空间。

互动环节:你能结合插入排序的原理,设计一个场景说明它在处理小规模数据时的优势吗?

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。