C语言之快速排序

1.代码实现

#include<stdio.h>

int quicksort(int _left,int _right,int a[])
{
	int pd1=0,pd2=0;//这两个变量检测数组是否已经提前排好序,减少时间复杂度
	int left=_left,right=_right;
	int pole=_left, kl;
	if (_left >= _right) return 0; // 递归终止条件(当此部分数组过小结束)
	while (left != right)//总循环,进行一次左或右循环后,left或者right会自动和pole重合,不用再做判断
	{
		while (right > pole)//右循环
		{
			if (a[right] < a[pole])
			{
				pd1 = 1;//如果右循环执行过,则数组可能还未排好序,下一次继续嵌套
				kl = a[right]; a[right] = a[pole]; a[pole] = kl;//内容互换
				pole = right;
				break;
			}
			else right--;
		}
		while (left < pole)//左循环
		{
			if (a[left] > a[pole])
			{
				pd2 = 1;//如果左循环执行过,则数组可能还未排好序,下一次继续嵌套
				kl = a[left]; a[left] = a[pole]; a[pole] = kl;//内容互换
				pole = left;
				break;
			}
			else left++;
		}
	}
	if(pd1==0&&pd2==0)//如果下面两个嵌套函数都排好序,则函数终结
		return 0;
	//注意:下面两个嵌套函数是顺序执行的,先将pd1排好序,再排pd2
	if (pd1 == 1)
		quicksort(_left, pole - 1, a);//left
	if(pd2 == 1)
		quicksort(pole + 1, _right, a);//right
}

int main()
{
	int a[] = { 3,4,6,1,2,4,7 };
	quicksort(0, 6, a);
	for (int i = 0; i < 7; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

2.算法分析

策略:采用分治法

  1. 分治法的步骤

    • 划分:选择一个枢轴(pole),将数组划分为两部分,一部分的所有元素小于等于枢轴,另一部分的所有元素大于等于枢轴。
    • 递归:对划分后的两部分分别递归地进行排序。
    • 合并:由于快速排序是就地排序,所以不需要显式的合并步骤,排序完成后数组自然就是有序的。

时间复杂度

最佳情况:O(nlog⁡n)

平均情况:O(nlog⁡n)

最坏情况:O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值