算法设计与分析——快速排序

	对于快速排序,有原地分区算法和双指针算法,这里采用的是原地分区算法,两种算法
略有不同,但是其核心思想都是一样的,将小于的放到左边,大于的放到右边。

	原地分区算法:每一次维护一个中轴,这个中轴左边的是比目标值小的,右边的是比目标值
大的,每一次只要将小于的移动到中轴左边,并将中轴++,最后得到的就是目标序列了
	
	双指针法:双指针法用两个指针指向数组的头和尾,将头部的值保存起来,然后从后面开始,
找到第一个小于头值的元素,替换头指针指向的元素,这时尾指针所在位置就会 “空缺” 出一个
位置,这时移动头指针,找到第一个大于头值的元素,并将它替换尾指针指向的元素,这时头指针
又会 “空缺出一个位置”,如此循环往返,只要尾指针等于头指针,就将头值放到这个位置,当然,
这个是升序排序的思维

这篇文章采用的是原地分区算法

注:这份代码经过蓝桥官网试题集的算法训练的 景点游览 的检验,只是这个是升序排列的代码

int Potion(int * a, int l, int r) // 原地分区算法  
{
	int x = a[l];
	int m = l, mid = l;	// m 指向中轴
	for(int i = l + 1; i <= r; ++i)
	{
		if(a[i] < x)
		{
			if(m == mid)	// 由于在移动的时候总是会出现开始元素移动的现象,所以用 mid 专门保存这一元素位置
			{
				mid = i;
			}
			else if(i == mid)
			{
				mid = m;
			}
			swap(a[i], a[m]);
			++m;
		}
	}
	swap(a[mid], a[m]);
	return m;
}
void Qsort(int * a, int l, int r)
{
	if(r <= l)
	{
		return ;
	}
	int temp = Potion(a, l, r);
	Qsort(a, l, temp - 1);
	Qsort(a, temp + 1, r);
}

算法复杂度分析:
最坏的情况是每一次排序,目标元素都不移动位置,相当于简单选择排序,这时算法复杂度是O(n ^ 2)
剩余的情况不管怎么分,都会是这样:

在这里插入图片描述

	对于第一个元素,他会进行 n - 1 次排序,相当于 O(n),也就是一个常数 C * n,而对于后面的
每一项都如此考虑的话,就相当于每一项都是一个C * n,当 (n / (2 ^ m) == 1) 停止,即一共有 
(m = log n),所以不管 a 和 b 怎么取值,只要和为1,那么复杂度就是 O(n * log n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值