快排和sort

快排和sort

快排代码:

typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f;
ll a[maxn];
ll part(ll i,ll j){
	ll pivot=a[i];
	while(i<j){
		while(a[j]>=pivot && i<j)
			j--;
		swap(a[j],a[i]);
		while(a[i]<=pivot && i<j)
			i++;
		swap(a[j],a[i]);
	}
	a[i]=pivot;
	return i;
}
void Qsort(ll i,ll j){
	if(i<j){
		ll pivot=part(i,j);
		Qsort(i,pivot-1);
		Qsort(pivot+1,j);
	}
}
int main(){
	Qsort(0,n-1);
	return 0;
}

关于sort部分
前言
当你第一眼看到这道面试题是不是心里在暗喜,一问算法题就比问排序算法,一问排序算法就问快速排序。
如果你回答:

STL里的sort算法肯定用的是快速排序啊?难不成还是冒泡排序么?

如果你只是回答快速排序,那么恭喜你只答对了33.333%,离正确答案还差一大截。

回答完,接着会引来一堆问题轰炸:

  • 数据量大和数据量小都适合用快速排序吗?
  • 快速排序的时间复杂度不是稳定的nlogn,最坏情况会变成n^2,怎么解决复杂度恶化问题?
  • 快速排序递归实现时,怎么解决递归层次过深的问题?
  • 递归过深会引发什么问题?
  • 怎么控制递归深度?如果达到递归深度了还没排完序怎么办?

首先,回答用到哪种排序算法,正确答案是:

毫无疑问是用到了快速排序,但不仅仅只用了快速排序,还结合了插入排序和堆排序。

是不是很惊喜,很意外?

为什么?直接看STL源码实现,来源于侯捷老师翻译的鼎鼎大名的《STL源码剖析》关于sort算法实现的细节,实现细节有很多精彩的地方。

并非所有容器都使用sort算法
既然问的是STL的sort算法实现,那么先确认一个问题,哪些STL容器需要用到sort算法?
首先,关系型容器拥有自动排序功能,因为底层采用RB-Tree,所以不需要用到sort算法。
其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允许用户对元素排序。
剩下的vector、deque,适用sort算法。

实现逻辑
STL的sort算法,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。

在这里插入图片描述
结合快速排序-插入排序-堆排序 三种排序算法。

sort的STL源码: https://www.cnblogs.com/AlvinZH/p/8682992.html

发布了19 篇原创文章 · 获赞 15 · 访问量 2467

猜你喜欢

转载自blog.csdn.net/qq_41829380/article/details/104213551
今日推荐