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

快速排序


算法原理

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

总结

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

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

相关推荐
To_OC9 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
小bo波13 小时前
使用Thread子类创建线程 VS 使用Runnable接口创建线程的区别
java·多线程·thread·并发编程·runnable
SamDeepThinking13 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
学测绘的小杨14 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
用户9385156350714 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC15 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥16 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
张不才16 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
地平线开发者17 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者17 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶