基本排序算法之3——快速排序quicksort
快排的思路就不说了,中轴分组,借助一个临时单元。时间复杂度O(NlogN)。下面是实现:
#include<iostream>
using namespace std;
template<typename T>
bool _less(T a,T b)
{
return a<b;
}
template<typename T,typename F>
void qsort(T a[],int n,F f=_less<T>)
{
if(n<2)return;
int first=0,last=n-1;
T temp=a[0];
while(first!=last)
{
while(first!=last && !f(a[last],temp))last--;
a[first]=a[last];
while(first!=last && f(a[first],temp))first++;
a[last]=a[first];
}
a[first]=temp;
qsort(a,first,f);
qsort(a+last+1,n-last-1,f);
}
template<typename T>
void show(T a[],int n)
{
for(int i=0;i<n;++i)
{
cout<<a[i]<<' ';
}
cout<<endl;
}
int main()
{
float a[]={3.22,4.6,1.27,9.81,5.5,0.12,2.75,6.7,7.01,8.32};
qsort(a,10,_less<float>);
show(a,10);
return 0;
}
注意几点:
1.模板类支持默认模板参数。模板函数或者成员模板函数不支持默认模板参数(STL里的sort是通过重载了两份函数支持第三个参数!而不是用默认模版参数!!)
2.模版函数调用不要写类型参数,编译器自动推断。
3.递归的关键就在于边界条件是否考虑完全。
4.参考书表示:选取第一个元素为中枢是错误的,常用的是三分中值分割法(Median of Three Partitioning)!!就是取a[first]、a[last]、a[(first+last)/2]的中间值。
寻找信心决心和贪心的一致性,达到情绪和环境的平衡,做到行动和思维一致才叫真正的行动。

浙公网安备 33010602011771号