0

0

C# 快速排序实现方法 C#如何编写QuickSort算法

畫卷琴夢

畫卷琴夢

发布时间:2026-03-12 14:59:39

|

948人浏览过

|

来源于php中文网

原创

最稳妥的QuickSort方法签名是void QuickSort(int[] arr, int left, int right);递归终止条件为left >= right;应原地排序,以left为pivot,用双指针分区。

c# 快速排序实现方法 c#如何编写quicksort算法

QuickSort 方法签名怎么写才合理

直接用 void QuickSort(int[] arr, int left, int right) 是最稳妥的起点。不建议封装成泛型方法一上来就处理 IComparableIComparer —— 大多数实际场景只是排 int[]double[],过早泛化反而掩盖边界逻辑。递归终止条件必须是 left >= right,不是 left > right,否则单元素子数组会被跳过。

  • 入参用 int 索引而非 Span<int></int>,避免 .NET Core 之外环境兼容问题
  • 不返回新数组,原地排序更符合 C# 常见 API 设计(如 Array.Sort
  • 不要把 pivot 选在 right 位置后直接 swap 到末尾——容易和分区逻辑混淆,统一用 left 作 pivot 更易读

分区逻辑(Partition)里最容易错的三件事

分区函数的核心是「把小于 pivot 的全挪到左边,大于的全挪到右边」,但新手常卡在指针移动和交换时机上。正确做法是用两个指针:一个从左往右找 >= pivot 的,一个从右往左找

  • 内层 while 循环必须带边界检查:while (i ,漏掉 <code>i 会导致越界
  • 交换完别忘了移动指针:i++j-- 必须在每次 swap 后执行,否则死循环
  • 最后一步不是 swap(arr[i], arr[right]),而是 swap(arr[left], arr[j]) —— 因为 pivot 始终在 left,而 j 停在最后一个

递归调用时左右子区间怎么划

分区结束后,pivot 已就位,索引是 j(假设你按上面方式实现)。那么左子数组是 [left, j - 1],右子数组是 [j + 1, right]。注意不是 [left, j][j, right] —— 那样会重复处理 pivot 或漏掉元素。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载
  • 递归前加个防护:如果 j - 1 > left 再进左递归,避免无意义调用
  • 右递归同理:只在 j + 1 时调用,尤其对小数组能省几层栈帧
  • 不要试图用尾递归优化(比如只递归左半边、循环处理右半边)——C# 编译器不保证尾调用优化,且可读性下降

实际用时要不要替换为 Array.Sort

手写 QuickSort 仅适合学习或特殊场景(比如要监控比较次数、定制 pivot 策略、或嵌入不可引用 BCL 的环境)。生产代码中,Array.Sort(arr) 在大多数数据分布下比手写快,因为它混合了 introsort(快排+堆排+插排),还做了缓存友好优化。

  • 如果你需要稳定排序,Array.Sort 不稳定,得换 List<t>.OrderBy</t> 或自己加稳定层
  • 对极小数组(length ),手写快排反而慢于插入排序,而 <code>Array.Sort 内部已做这个判断
  • 调试时打日志别放在递归入口——高频调用会让输出爆炸,改用条件断点或只在 right - left > 100 时记录

递归深度和 pivot 选择策略才是真正影响性能的隐藏变量,但多数人只盯着交换逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

612

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

106

2025.10.23

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号