快速排序的详解

  1. 分治策略:将大问题分解为小问题解决

  2. 关键操作:选择基准(Pivot)并进行分区(Partition)

  3. 递归处理:对分区后的子数组递归排序


前言

1. 快速排序概述

快速排序(Quick Sort)是由英国计算机科学家 Tony Hoare 于1960年提出的一种高效的 分治排序算法。它在平均情况下的时间复杂度为 O(n log n),最坏情况下为 O(n²)(但可通过优化避免),且是 原地排序(不需要额外空间)。

2. 算法步骤详解

(1)选择基准

从数组中选取一个元素作为基准,常见选择方式: 第一个元素(简单但易导致最坏情况)最后一个元素(实现简单)随机元素(推荐,避免最坏情况) 三数取中(Median-of-Three,进一步优化)

(2)分区

将数组重新排列,使得:所有 ≤ Pivot 的元素位于其左侧所有 > Pivot 的元素位于其右侧  Pivot 位于最终正确位置

(3)递归排序

对左右两个子数组递归执行上述过程

#include
#include
#include
void swap(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
}
int partition(int arr[],int low,int high)
{
    int rem_pd=low+rand()%(high-low+1);
    swap(&arr[rem_pd],&arr[high]);
    int pd=arr[high];
    int i=low;
    for(int j=low;j

swap函数

功能:交换两个整数的值   参数:两个整数的指针  实现:使用临时变量temp完成交换

参数:arr[] - 待排序数组  low - 当前分区的起始索引  high - 当前分区的结束索引

实现步骤:随机选择基准:为了避免在已排序数组上出现最坏情况O(n²),随机选择一个元素作为基准将基准移到末尾:交换随机选择的基准和最后一个元素初始化指针i:i指向小于基准的子数组的末尾遍历数组:j从low到high-1,将小于基准的元素交换到i的位置,并递增i放置基准:最后将基准元素放到i的位置 返回基准位置:i就是基准的最终位置

3. 算法分析

时间复杂度

情况 复杂度 说明
最好 O(n log n) 每次分区均匀划分
平均 O(n log n)
最坏 O(n²) 数组已有序且基准固定

空间复杂度

递归栈深度:O(log n)原地排序:不需要额外存储空间

稳定性   

快速排序是 不稳定排序(相同元素的相对位置可能改变)

4. 常见面试题

为什么快速排序比归并排序快?

快速排序的常数因子更小,且是原地排序

如何避免最坏情况?使用随机化基准或三数取中

快速排序的递归深度是多少?平均O(log n),最坏O(n)


总结

快速排序因其高效的 平均性能 和 原地排序 特性,成为最常用的排序算法之一。通过合理选择基准和优化策略,可以避免最坏情况,使其在各种场景下都能保持优异性能。

你可能感兴趣的:(快速排序的详解)