007:排序,又见排序!
描述
自己编写一个能对任何类型的数组进行排序的mysort函数模版。只能写一个mysort模板,不能写mysort函数!
#include <iostream>
using namespace std;
bool Greater2(int n1,int n2)
{
return n1 > n2;
}
bool Greater1(int n1,int n2)
{
return n1 < n2;
}
bool Greater3(double d1,double d2)
{
return d1 < d2;
}
template <class T1,class T2>
void mysort(
// 在此处补充你的代码
#define NUM 5
int main()
{
int an[NUM] = { 8,123,11,10,4 };
mysort(an,an+NUM,Greater1); //从小到大排序
for( int i = 0;i < NUM; i ++ )
cout << an[i] << ",";
mysort(an,an+NUM,Greater2); //从大到小排序
cout << endl;
for( int i = 0;i < NUM; i ++ )
cout << an[i] << ",";
cout << endl;
double d[6] = { 1.4,1.8,3.2,1.2,3.1,2.1};
mysort(d+1,d+5,Greater3); //将数组从下标1到下标4从小到大排序
for( int i = 0;i < 6; i ++ )
cout << d[i] << ",";
return 0;
}
输入
无
输出
4,8,10,11,123,
123,11,10,8,4,
1.4,1.2,1.8,3.1,3.2,2.1,
解题
构建模板函数——左开右闭
关键点
模板的类型——T为int * 的话,进行swap时无法利用模板T对temp变量定义类型,无法进行交换
故T必须为int,需在函数上写T *s。
template <class T1,class T2>
void mysort(T1 *s, T1 *e, T2 rule){ //T1需为int,不然没法完成swap
int size = e-s;
for (int i=size-1;i>0;--i){ //右开,故e不算
for(int j=0;j<i;++j){
if(rule(s[j+1],s[j])){ //不满足
T1 temp=s[j]; //auto 自动推断
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
}
或者将swap写在外面,无需在函数内部构建临时变量,则可使T为int * 类型;
template<class T>
void Swap( T & a, T & b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
template <class T1,class T2>
void mysort( T1 start , T1 end, T2 myless )
{
int size = end - start;
for( int i = size -1;i >= 0 ; --i ) {
for( int j = 0; j < i ; ++j ) {
if( myless( * ( start + j+1), * (start+j) )) {
Swap(* ( start + j+1), * (start+j) );
}
}
}
}
另一种办法,利用auto,自适应变量的类型;
template <class T1,class T2>
void mysort( T1 start , T1 end, T2 myless )
{
int size = end - start;
for( int i = size -1;i >= 0 ; --i ) {
for( int j = 0; j < i ; ++j ) {
if( myless( * ( start + j+1), * (start+j) )) {
auto tmp = * ( start+j);
* ( start +j ) = * ( start + j+1);
* ( start + j+1) = tmp;
}
}
}
}
易错点
模板变量T 的类型要仔细核对,函数中T 和 T*要分清楚。