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

快速排序


算法原理

快速排序(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);
    }
}

总结

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

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

相关推荐
2601_96798011几秒前
Python 初学者必备的常用内置函数
python·编程语言·内置函数·初学者·常用函数
OnlineProxy7 分钟前
移动应用数据爬取:通过模拟器与流量嗅探对 API 进行逆向工程
爬虫·python·httpx
阿俊-全栈开发14 分钟前
LikeShop 多商户 Java 版商城微服务模块拆分与部署架构演进实践
java·微服务·架构·likeshop开源商城·多商户源码
揽星河..19 分钟前
【C语言】猜数字游戏
c语言·算法·游戏
染指111023 分钟前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
Y.99934 分钟前
电脑黑屏只有鼠标能动
学习
Wang's Blog37 分钟前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我1234542 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
架构师伯子明43 分钟前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
LabVIEW开发1 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序