c语言快速排序_快速排序(C语言)

本文首发于本人CSDN博客,禁止转载

版权声明:本文为CSDN博主「NMG_CJS」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/NMG_CJS/article/details/102876856​blog.csdn.net

简介

快速排序与归并排序一样也是一种分治递归算法,其排序(升序)步骤可以简述如下:

1、在待排元素集合N中任选一元素做为枢纽元

2、开始分割元素,使左部元素均小于枢纽元,右部元素均大于枢纽元

3、对左右子序列递归应用步骤1、2

1、选取枢纽元

有一种极其常见的、错误的、非常糟糕的枢纽元的选取,是选取数组第一个或者最后一个元素为枢纽元,如果输入序列是随机的那么上述做法可以接受,但如果输入的序列与我们要排的序列正好相反,那么在分割元素阶段就会出现所有元素被划分到左半部或者右半部,更糟糕的是,在其后续递归过程中也是如此,那么其排序花费的时间将是二次的,因此该种枢纽元的选取应该摒弃。

void 

那么我们该如何选取枢纽元呢?有两种常见的做法,一种是使用随机数生成器随机选取(但我们要注意到随机数的选取是昂贵的),另一种做法是选取3个数的中位数,这种选取方式总的来说是好的稳妥的,如下:

void 

2、分割策略

分割所做的事就是将小元素移动到数组左边,大元素移动到数组右边,一种安全稳妥的分割策略是,选取枢纽元之后将其与最后一个元素交换,然后对第0个元素和倒数第二个元素分割,因为没有必要对枢纽元进行分割,故将其移动到最后进行隐藏,具体分割步骤如下:

a9302f7380d23fd801725165a9c5535c.png

22c871650e54dd0d9c711f4a45a11cbc.png

上述分割策略摘自数据结构与算法分析第二版page180

3、代码实现

#define Cutoff (3)

参考文献

数据结构与算法分析第二版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值