快速排序算法(QuickSort)
字数 942 2025-10-25 22:15:07

快速排序算法(QuickSort)

题目描述:给定一个整数数组,使用快速排序算法将其按升序排列。快速排序是一种高效的排序算法,采用分治策略,平均时间复杂度为O(n log n)。

解题过程:

  1. 基本思想
    快速排序的核心是"分治":选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于等于基准,右边部分的元素都大于等于基准,然后递归地对左右两部分进行排序。

  2. 分区过程(Partition)
    这是快速排序最关键的一步,具体操作如下:

  • 从数组中选择一个基准元素(通常选择第一个、最后一个或中间元素)
  • 设置两个指针:左指针从数组起始位置开始,右指针从数组末尾开始
  • 左指针向右移动,直到找到大于基准的元素
  • 右指针向左移动,直到找到小于基准的元素
  • 交换这两个元素
  • 重复上述过程,直到左指针超过右指针
  • 最后将基准元素放到正确的位置
  1. 递归排序
    分区完成后,数组被分为三个部分:
  • 左子数组:所有元素小于基准
  • 基准元素:已经在正确位置
  • 右子数组:所有元素大于基准
    然后递归地对左子数组和右子数组进行快速排序。
  1. 具体示例
    以数组 [3, 6, 8, 10, 1, 2, 1] 为例:

第一步:选择最后一个元素1作为基准
分区过程:

  • 左指针在3停止(3>1),右指针在1停止(1≤1)
  • 交换3和1:数组变为[1, 6, 8, 10, 1, 2, 3]
  • 继续:左指针在6停止,右指针在2停止,交换6和2:[1, 2, 8, 10, 1, 6, 3]
  • 继续:左指针在8停止,右指针在1停止,此时左指针已超过右指针
  • 将基准1放到正确位置:[1, 2, 1, 10, 8, 6, 3] → [1, 2, 1, 3, 8, 6, 10]

第二步:递归排序左子数组[1, 2, 1]和右子数组[8, 6, 10]

  1. 时间复杂度分析
  • 最佳情况:O(n log n) - 每次分区都能均匀划分
  • 最差情况:O(n²) - 每次分区都极不均匀
  • 平均情况:O(n log n)
  1. 优化措施
  • 三数取中法:选择首、中、尾三个元素的中值作为基准
  • 小数组使用插入排序:当子数组规模较小时,切换为插入排序
  • 三向切分:处理包含大量重复元素的数组

快速排序在实际应用中非常高效,是很多编程语言内置排序函数的实现基础。

快速排序算法(QuickSort) 题目描述:给定一个整数数组,使用快速排序算法将其按升序排列。快速排序是一种高效的排序算法,采用分治策略,平均时间复杂度为O(n log n)。 解题过程: 基本思想 快速排序的核心是"分治":选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于等于基准,右边部分的元素都大于等于基准,然后递归地对左右两部分进行排序。 分区过程(Partition) 这是快速排序最关键的一步,具体操作如下: 从数组中选择一个基准元素(通常选择第一个、最后一个或中间元素) 设置两个指针:左指针从数组起始位置开始,右指针从数组末尾开始 左指针向右移动,直到找到大于基准的元素 右指针向左移动,直到找到小于基准的元素 交换这两个元素 重复上述过程,直到左指针超过右指针 最后将基准元素放到正确的位置 递归排序 分区完成后,数组被分为三个部分: 左子数组:所有元素小于基准 基准元素:已经在正确位置 右子数组:所有元素大于基准 然后递归地对左子数组和右子数组进行快速排序。 具体示例 以数组 [ 3, 6, 8, 10, 1, 2, 1 ] 为例: 第一步:选择最后一个元素1作为基准 分区过程: 左指针在3停止(3>1),右指针在1停止(1≤1) 交换3和1:数组变为[ 1, 6, 8, 10, 1, 2, 3 ] 继续:左指针在6停止,右指针在2停止,交换6和2:[ 1, 2, 8, 10, 1, 6, 3 ] 继续:左指针在8停止,右指针在1停止,此时左指针已超过右指针 将基准1放到正确位置:[ 1, 2, 1, 10, 8, 6, 3] → [ 1, 2, 1, 3, 8, 6, 10 ] 第二步:递归排序左子数组[ 1, 2, 1]和右子数组[ 8, 6, 10 ] 时间复杂度分析 最佳情况:O(n log n) - 每次分区都能均匀划分 最差情况:O(n²) - 每次分区都极不均匀 平均情况:O(n log n) 优化措施 三数取中法:选择首、中、尾三个元素的中值作为基准 小数组使用插入排序:当子数组规模较小时,切换为插入排序 三向切分:处理包含大量重复元素的数组 快速排序在实际应用中非常高效,是很多编程语言内置排序函数的实现基础。