管理员

发布于 2026年04月09日 18:16

数据结构与算法:排序算法详解

排序算法是数据结构与算法的核心基础,也是日常开发、面试高频考点。本文精简拆解五种常见排序算法,清晰讲解原理、代码、复杂度及适用场景,新手可快速掌握核心要点。

先明确三个核心概念,统一认知:

  • 时间复杂度:描述算法执行时间随数据量增长的趋势,重点关注最坏及平均情况。

  • 空间复杂度:描述算法所需额外空间的趋势,分为原地排序(O(1))和非原地排序。

  • 稳定性:排序后相同值元素相对位置不变,多条件排序中尤为重要。

一、冒泡排序(Bubble Sort)——入门级排序

1. 核心原理

两两比较相邻元素,将较大元素逐步“冒”到数组末尾,重复操作至全部有序,本质是相邻元素交换。

2. 简洁代码(Python)

def bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        for j in range(n-1-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

3. 复杂度与稳定性

  • 时间复杂度:最坏/平均O(n²),最好O(n)(有序时可优化);

  • 空间复杂度:O(1)(原地排序);

  • 稳定性:稳定。

4. 适用场景

数据量极小(n<100)、入门练习,实际开发中极少使用。

二、选择排序(Selection Sort)——简单高效略优于冒泡

1. 核心原理

每次从待排序元素中找到最小(大)值,放到待排序区间开头,重复至有序,减少交换次数。

2. 简洁代码(Python)

def selection_sort(arr):
    n = len(arr)
    for i in range(n-1):
        min_index = i
        for j in range(i+1, n):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr

3. 复杂度与稳定性

  • 时间复杂度:最坏/平均/最好均为O(n²)(无法优化);

  • 空间复杂度:O(1)(原地排序);

  • 稳定性:不稳定。

4. 适用场景

数据量极小、交换成本高的场景,整体效率较低,不适合大规模数据。

三、插入排序(Insertion Sort)——简单排序中最实用

1. 核心原理

将数组分为已排序和未排序区间,依次将未排序元素插入已排序区间的合适位置,直至有序。

2. 简洁代码(Python)

def insertion_sort(arr):
    n = len(arr)
    for i in range(1, n):
        temp = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > temp:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = temp
    return arr

3. 复杂度与稳定性

  • 时间复杂度:最坏/平均O(n²),最好O(n)(有序时);

  • 空间复杂度:O(1)(原地排序);

  • 稳定性:稳定。

4. 适用场景

数据量小(n<1000)、接近有序,或嵌入式系统(空间有限),是简单排序中最实用的一种。

四、快速排序(Quick Sort)——实际开发首选

1. 核心原理

分治法思想:选基准值,将数组分为“小于、等于、大于基准”三部分,递归排序左右子数组,直至有序(随机基准可避免最坏情况)。

2. 简洁代码(Python,随机基准优化)

import random

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = random.choice(arr)
    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)

3. 复杂度与稳定性

  • 时间复杂度:平均/最好O(nlogn),最坏O(n²)(可通过随机基准规避);

  • 空间复杂度:O(logn)~O(n)(递归栈,非原地);

  • 稳定性:不稳定。

4. 适用场景

大规模数据排序(n>1000)、数据分布均匀场景,效率极高,是实际开发首选。

五、归并排序(Merge Sort)——稳定高效

1. 核心原理

分治法思想:先将数组递归拆分至单个元素(天然有序),再逐步合并两个有序子数组,直至得到完整有序数组。

2. 简洁代码(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):
    res, i, j = [], 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            res.append(left[i])
            i += 1
        else:
            res.append(right[j])
            j += 1
    res.extend(left[i:])
    res.extend(right[j:])
    return res

3. 复杂度与稳定性

  • 时间复杂度:最坏/平均/最好均为O(nlogn)(稳定);

  • 空间复杂度:O(n)(非原地,需额外存储);

  • 稳定性:稳定。

4. 适用场景

大规模数据、要求稳定排序(如多条件排序)、外部排序(数据无法全部放入内存)场景。

六、五种排序算法汇总(面试必背)

image.png

七、总结与面试要点

1. 简单排序(冒泡、选择、插入):O(n²),适用于小规模数据,重点掌握插入排序;

2. 高效排序(快速、归并):O(nlogn),适用于大规模数据,是面试重点;

3. 面试重点:快排与归并的区别(稳定性、空间、场景),快排的优化方法;

4. 实际开发:优先使用语言内置排序(如Python sort()),按需选择排序算法。


分享本文:

评论 (0)

发表评论

相关文章

未定
Python数据分析入门到精通:从基础到实战

​本系列文章将带你从Python基础开始,逐步掌握NumPy、Pandas和Matplotlib等数据分析工具,最后通过实战项目巩固所学知识,成为数据分析高手。

阅读全文
未定
数据结构与算法:排序算法详解

排序算法是数据结构与算法的核心基础,也是日常开发、面试高频考点。本文精简拆解五种常见排序算法,清晰讲解原理、代码、复杂度及适用场景,新手可快速掌握核心要点。

阅读全文
未定
现代JavaScript:从ES6到ESNext,解锁代码简洁高效的密钥

作为前端开发的核心语言,JavaScript从未停止进化的脚步。自2015年ES6(ECMAScript 2015)正式发布以来,它彻底摆脱了“简陋脚本语言”的标签,迎来了语法升级的爆发期;而后续不断迭代的ESNext(ES2016及以后版本),则持续优化开发体验,解决实际开发痛点,让我们的代码更简洁、更高效、更具可维护性。

阅读全文