排序算法-快速排序

源代码git地址

算法原理:

轴点的概念:任意序列S[lo,hi],对应的有序向量为S'[lo,hi]。若把S分为前后两个子序列,S[lo,mid)/S[mid,hi)。如果mid为轴点,那么则满足:

  • S[mid]=S'[mid]
  • 前后子序列的成员完全相同

例如:[1,2,4,5,77,88,99]和[4,2,1,5,88,99,77],那么5就是序列的轴点。

前后序列完成排序后,整体即可排序。采用分治策略,递归完成整个序列排序

不变性:

适应范围:

实际应用:

算法实现:

第一步

template <typename T>//[lo,hi)
void vector<T>::quickSort ( Rank lo, Rank hi )
{
	if (hi - lo < 2) return; //递归基

	Rank pivotRank = partition(lo, hi - 1);//[lo, hi - 1]
	quickSort(lo, pivotRank);//[lo,pivotRank)
	quickSort(pivotRank + 1, hi);//[pivotRank+1,hi)

}

第二步


template <typename T>//通过调整元素位置构造区间[lo, hi]的轴点,并返回其秩
Rank vector<T>::partition ( Rank lo, Rank hi )
{
	std::swap(_data[lo],_data[rand() % (hi - lo)]);//设置首元素为随机点
	T pivot = _data[lo];//轴点
	while (lo < hi)
	{
		while (lo < hi && pivot <= _data[hi])//轴点判断
		{
			hi--;//右序列左展
		}
		_data[lo] = _data[hi];//异于轴点,放入对应序列

		while (lo < hi && pivot >= _data[hi])
		{
			lo++;//左序列右展
		}
		_data[hi] = _data[lo];
	}

	_data[lo] = pivot;//轴点数据赋值

	return lo;
}

 

算法分析:

算法分析
算法名称时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性
冒泡O(nlogn)O(n^2)O(nlogn)0(1)不稳定

算法时间复杂度:

n + (n-1) + (n-2) + ...+2+1

算法优化:

对于重复元素较多的情况,可以针对重复元素进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值