程序已在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();
}
运行结果如下:
如有问题,欢迎讨论。