通过图文来理解快速排序的过程

本文详细介绍了快速排序的基本思想、三种实现方式(左右指针法、挖坑法、前后指针法),并提供了每种方法的代码实现。此外还讨论了快速排序的时间复杂度,并提出了优化方案。

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

1.快排的基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.快排的三种实现方式

2.1左右指针法


代码实现:

int PartSort(int* a,int left,int right)
{
	if (left >= right)
		return 0;
	int key = right;
	while (left < right)
	{
		while (a[left] <= a[key] && left < right)
		{
			left++;
		}
		while (a[right] >= a[key] && left < right)
		{
			right--;
		}
		swap(a[left], a[right]);
	}
	swap(a[left], a[key]);
	return left;
}
void QuickSort(int* a, int left, int right)
{
	assert(a != NULL);
	if (left >= right)
		return;
	int div = PartSort(a, left, right);
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}



2.2挖坑法

挖坑法实现与左右指针法类似,首先用一个变量保存key的值,那么key值所在的位置就可以用其他数据填充,也就是所谓的坑,然后从前往后遍历数组,一旦遇到比key值大的时候,停下来,将这个数据填到坑中,那么这个数据以前的位置称为新的坑,下一步找数据比key小的值,找到之后将数据填到坑中。。

实现代码:
int PartSort(int* a, int left, int right)
{
	int tmp = a[right];
	while (left < right)
	{

		while (a[left] <= tmp&&left < right)
		{
			left++;
		}
		a[right] = a[left];
		while (a[right] >= tmp&&left < right)
		{
			right--;
		}
		a[left] = a[right];
	}
	a[left] = tmp;
	return left;
}
void QuickSort(int* a, int left, int right)
{
	assert(a != NULL);
	if (left >= right)
		return;
	int div = PartSort(a, left, right);
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}


2.3前后指针法



int PartSort(int* a, int begin, int end)
{
	int cur = begin;
	int prev = begin - 1;	
	while (cur < end)
	{
		while (cur < end  && a[cur] > a[end])
		{
			cur++;
		}
		if (cur < end)
		{
			prev++;
			swap(a[cur], a[prev]);
			cur++;
		}
	}
	prev++;
	swap(a[prev], a[end]);
	return prev;
}
void QuickSort(int* a, int left, int right)
{
	assert(a != NULL);
	if (left >= right)
		return;
	int div = PartSort(a, left, right);
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}


3.快排的时间复杂度分析


正是因为快排最差的情况可能出现时间复杂度为O(N^2)的情况,所以有必要对快排算法进行优化,常见的有三数取中法和减少递归层次的办法解决。

附:
快排的优化链接:点击打开链接





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值