快速排序----模板实现

程序已在vector和list上测试。

虽然不要重复发明轮子,但是也得有发明轮子的能力。

template<typename iter,typename va_type>
void quicksort(iter left,iter right,Less<va_type> less=Less<va_type>()){
	if(left!=right){
		iter tmp = partition<iter,va_type>(left,right);
		if(tmp!=left){
			quicksort<iter,va_type>(left,--tmp);
			++tmp;
		}
		if(tmp!=right)quicksort<iter,va_type>(++tmp,right);	
	}
}
template<typename iter,typename va_type>
iter partition(iter left,iter right,Less<va_type> less=Less<va_type>()){
	iter i,j;
	i = left;
	++i;
	j = left;;
	while(i!=right){
		if(less(*i,*left)){
			++j;
			swap_my<iter>(j,i);;
		}
		++i;
	}
	if(i==right){
		if(less(*i,*left)){
			++j;
			swap_my<iter>(j,i);;
		}
	}
	swap_my<iter>(left,j);	
	if(less(*i,*left))swap_my<iter>(left,i);
	return j;
}
函数的第三个参数是谓词,也就是我们常说的仿函数。

我这里默认的是小于,即递增数列。

template<typename T>
struct Less{
	bool operator ()(const T a,const T b){
		return a<b;
	}
};
template<typename T>
void swap_my(T s1,T s2){
	if(*s1!=*s2){
		*s1 = *s1 + *s2;
		*s2 = *s1 - *s2;
		*s1 = *s1 - *s2;
	}
}
测试代码如下:

#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using std::partition;
using std::cout;
using std::endl;
using std::list;
using std::vector;
void test1(){
	list<int>l_int;
	l_int.push_back(13);
	l_int.push_back(3);
	l_int.push_back(5);
	l_int.push_back(2);
	l_int.push_back(9);
	l_int.push_back(6);
	l_int.push_back(4);
	l_int.push_back(7);
	l_int.push_back(8);
	l_int.push_back(10);
	l_int.push_back(1);
	list<int>::iterator p1 = l_int.begin();
	list<int>::iterator p2 = l_int.end();
	quicksort<list<int>::iterator,int>(p1,--p2);
	list<int>::iterator p3 = l_int.begin();
	list<int>::iterator p4 = l_int.end();
	display<list<int>::iterator>(p3,p4);
}
void test2(){
	vector<int> veci;
	veci.push_back(3);
	veci.push_back(2);
	veci.push_back(1);
	veci.push_back(12);
	veci.push_back(11);
	veci.push_back(14);
	veci.push_back(7);
	veci.push_back(9);
	vector<int>::iterator p1 = veci.begin();
	vector<int>::iterator p2 = veci.end();
	quicksort<vector<int>::iterator,int>(p1,--p2);
	display<vector<int>::iterator>(veci.begin(),veci.end());
}
int main(){
	test1();
	test2();
}
运行结果如下:

如有问题,欢迎讨论。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值