基本排序算法之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]的中间值。

posted @ 2013-06-04 12:24  mjwk  阅读(348)  评论(0)    收藏  举报