快排的思路就不说了,中轴分组,借助一个临时单元。时间复杂度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]的中间值。