C语言排序算法——快速排序

本文介绍了快速排序的原理和实现思路。通过选取一个k值,将数组分成两部分,分别进行递归排序,实现时间复杂度为O(nlogn)的排序。文章还讨论了如何通过‘三数取中’策略避免最坏情况,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

快速排序是将等待排序的集合分成两部分,设定一个k值,其中一部分小于这个k值,另外一部分大于这个k值。对每个部分重复这个过程。知道每部分都只有一个元素的时候。就可以完成排序了。

实现思路

首先我们需要选取一个k值, 一般情况下我们可以使用数组的第一个值或者最后一个值。
假设我们先选取数组的第一位为k值。 我们假设为6。
在这里插入图片描述
然后我们利用两个指针,一个指针(left)从左边开始向右移动,一个指针(right)从右边开始向左移动,当left指针找到一个大于k值时停下,当right指针找到一个小于k值时停下。 然后交换两个指针指向的值,之后再各自移动。当两指针相遇时停下。然后将所在位置的值与k值,即数组的第一个位置交换。
在这里插入图片描述
需要注意的是,当我们使用这样的方法交换元素时,如果我们我们的k值选择的是数组的第一个位置,则在移动时,我们需要先移动right指针,再移动left指针,这样才能确保我们最后指针在相遇时, 是一个小于k的元素所在的位置,这样在和k值交换后才能保证数组前部分的所有元素都是小于k的,后半部分都是大于k的。
同理,如果我们的k值选择的是数组末的位置,则在移动时,需要先移动left指针,再移动right指针,以确保最后指针相遇在一个大于k值的元素所在的位置。

这样, 我们第一趟排序就完成了。然后整个数组以k为分解分成了两部分,我们只需要对这两部分都在进行这样的操作,递归调用。最终就可以完成排序。

快速排序的时间复杂度是不稳定的,因为我们一直将数组分段,如果我们每次都恰好将元素分成相等的两部分,这时候我们可以得到最好的结果。即时间复杂度为O(nlogn)。可如果我们每次都恰好选到了数组中最大或最小的元素。那我们就会得到最差的结果,即时间复杂度为O(n²)。

实现代码

所以我们在实现代码时,为了避免我们遇到“每次选择的k值都恰好是最大或者最小的数”这种情况。我们加入了“三数取中”的部分。即每次选取k时, 我们从数组的第一个元素 , 最后一个元素,中间的元素三个元素中选择大小中间的值为k。具体代码为:

int* QuickSort(DATATYPE* data, int left, int right)
{
   
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值