八大排序:(三)快速排序

目录

[1. 算法原理](#1. 算法原理)

[2. 实现步骤](#2. 实现步骤)

[3. 代码实现](#3. 代码实现)

[4. 时间复杂度分析](#4. 时间复杂度分析)

[6. 优缺点](#6. 优缺点)

1.优点

2.缺点

[7. 优化方法](#7. 优化方法)

[8. 适用场景](#8. 适用场景)

[9. 与其他排序算法的比较](#9. 与其他排序算法的比较)

[10. 总结](#10. 总结)


1. 算法原理

快速排序(Quick Sort)是一种高效的排序算法,采用分治策略。其核心思想是:

  1. 选择基准元素:从待排序数组中选择一个元素作为基准
  2. 分区操作 :将数组分为两部分,使得左边的元素都小于等于基准右边的元素都大于等于基准
  3. 递归排序:对左右两个子数组分别进行快速排序

2. 实现步骤

  1. 选择基准元素(通常选择第一个元素、最后一个元素或中间元素)
  2. 从右向左寻找第一个小于基准的元素
  3. 从左向右寻找第一个大于基准的元素
  4. 交换这两个元素
  5. 重复步骤2-4,直到左右指针相遇
  6. 将基准元素与相遇位置的元素交换
  7. 对左右两个子数组递归执行上述步骤

3. 代码实现

cpp 复制代码
//快速排序的一次划分
int  Partition(int* arr, int low, int high)//O(n),O(1)
{
	int tmp = arr[low];//基准
	while (low < high)
	{
		//从后往前找比基准小的数字,往前移动
		while (low<high && arr[high] > tmp)
		{
			high--;
		}
		if (low < high)
		{
			arr[low] = arr[high];
		}
		//从前往后找比基准大的数据,往后移动
		while (low < high && arr[low] <= tmp)
		{
			low++;
		}
		if (low < high)
		{
			arr[high] = arr[low];
		}
	}
	arr[low] = tmp;
	return low;
}


void  Quick(int* arr,int low, int high)
{
	int par = Partition(arr, low,high);
	if (low < par - 1)//左边的数据个数超过一个
	{
		Quick(arr, low, par - 1);
	}
	if (par + 1 < high)
	{
		Quick(arr, par + 1, high);
	}
}


//快速排序
void  QuickSort(int* arr, int len)//(nlogn),O(logn),不稳定(缺点)
{
	Quick(arr, 0, len - 1);
}

4. 时间复杂度分析

  • 最佳情况:O(n log n) - 每次分区都将数组均匀分成两部分
  • 平均情况:O(n log n) - 大多数情况下的表现
  • 最坏情况:O(n²) - 当数组已经有序或逆序时,每次分区只能将数组分成一个元素和其余元素两部分

6. 优缺点

1.优点

  • 原地排序,空间复杂度低
  • 平均时间复杂度为O(n log n),效率高
  • 对于大型数据集表现良好

2.缺点

  • 最坏情况下时间复杂度为O(n²)
  • 对小规模数据集,插入排序可能更高效
  • 不稳定排序(相同元素的相对位置可能改变)

7. 优化方法

  1. 随机选择基准:避免最坏情况的发生
  2. 三数取中法:选择第一个、中间和最后一个元素的中位数作为基准
  3. 插入排序优化:对于小规模子数组(如长度小于10),使用插入排序
  4. 尾递归优化:减少递归调用栈的深度
  5. 并行处理:对于大型数组,可以并行处理左右子数组

8. 适用场景

  • 大型数据集的排序
  • 需要原地排序的场景
  • 对平均性能要求较高的场景

9. 与其他排序算法的比较

算法 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性
快速排序 O(n log n) O(n²) O(log n) 不稳定
归并排序 O(n log n) O(n log n) O(n) 稳定
堆排序 O(n log n) O(n log n) O(1) 不稳定
插入排序 O(n²) O(n²) O(1) 稳定
冒泡排序 O(n²) O(n²) O(1) 稳定

10. 总结

快速排序是一种高效的排序算法,通过分治策略和原地分区操作,在大多数情况下能够达到O(n log n)的时间复杂度。虽然存在最坏情况的风险,但通过合理的优化措施,可以有效避免这种情况的发生。快速排序是实际应用中最常用的排序算法之一,尤其适用于处理大型数据集。

相关推荐
黄敬峰1 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术2 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六6 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术6 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize7 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考20 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode