每天学习一个小算法:快速排序

快速排序


算法原理

快速排序(Quick Sort)是一种分治法(Divide and Conquer)排序算法。其基本思想是:选择一个元素作为基准值(pivot),将数组分区为两个子数组------比基准值小的元素和比基准值大的元素,然后递归地对这两个子数组进行排序。

快速排序的关键操作是分区(partition):重新排列数组,使得所有小于基准值的元素都移到基准值左边,所有大于基准值的元素都移到基准值右边。基准值在排序完成后就处于最终的正确位置


一、适用场景?

快速排序是实际应用中最常用的排序算法之一,特别适合:

  • 大数据集的排序,平均性能远优于O(n²)算法
  • 内存受限的场景(原地排序,空间开销小)
  • 对速度要求高的系统级应用
  • 不需要稳定性的排序场景
  • 大多数编程语言标准库的默认排序实现

快速排序的平均时间复杂度为O(n log n),在随机数据下表现最优。通过随机选择基准值或三数取中法,可以有效避免最坏情况的发生。

二、复杂度分析

1.时间复杂度

  • 最佳情况:O(n log n)
  • 平均情况:O(n log n)
  • 最坏情况:O(n²)(已排序数组)

2.空间复杂度

  • 递归栈:O(log n)(最佳)
  • 最坏:O(n)
  • 原地排序算法

三、代码实现

1、Python实现

python 复制代码
# 快速排序 Python 实现
def partition(arr, low, high):
    pivot = arr[high]
    i = low - 1
    for j in range(low, high):
        if arr[j] <= pivot:
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

def quickSort(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quickSort(arr, low, pi - 1)
        quickSort(arr, pi + 1, high)

# 调用方式: quickSort(arr, 0, len(arr) - 1)

2、Java实现

java 复制代码
// 快速排序 Java 实现
public class QuickSort {
    void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = (low - 1);
        for (int j = low; j < high; j++) {
            if (arr[j] < pivot) {
                i++;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, high);
        return i + 1;
    }
    
    void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }
}

3、C语言实现

c 复制代码
// 快速排序 C 语言实现
void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

// 分区函数
int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);
    
    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

// 快速排序主函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

总结

记录自己的快乐学习日志,也祝贺观看到这的小伙伴早日学有所成,财富自由💰💰。

记得点赞👍、收藏👋呀!!!

相关推荐
l1t1 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.05.13 题目:1674. 使数组互补的最少操作次数
笔记·算法·leetcode
liulilittle2 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
z200509302 小时前
【linux学习】linux的基本指令
linux·学习
每天回答3个问题2 小时前
LeetCodeHot100|回溯算法、46.全排列、78.子集、17.电话号码的字母组合
算法·深度优先·回溯
程似锦吖2 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言
techdashen2 小时前
dial9:给 Tokio 装上“飞行记录仪“
java·数据库·redis
2501_901006472 小时前
Golang怎么用gRPC Gateway_Golang gRPC Gateway教程【经典】
jvm·数据库·python
2501_901200532 小时前
golang如何实现错误预算Error Budget计算_golang错误预算Error Budget计算实现实战
jvm·数据库·python
2401_867623982 小时前
如何解决OUI图形界面无法调用_xhost与DISPLAY变量设置
jvm·数据库·python