排序算法-快速排序

源代码git地址

算法原理:

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

  • S[mid]=排序算法-快速排序[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(排序算法-快速排序) O(排序算法-快速排序) O(排序算法-快速排序) 0(1) 不稳定

算法时间复杂度:

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

算法优化:

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

排序算法-快速排序排序算法-快速排序 道格拉斯范朋克 发布了188 篇原创文章 · 获赞 81 · 访问量 31万+ 他的留言板 关注
上一篇:排序算法大全(选择、插入、希尔、归并、快速)java、C、python实现


下一篇:python求道06日