#include<iostream>
using namespace std;
template<typename T,int size>  //数组排序模板
void sort_array(T (&ary)[size])
{
	for(int i=0;i<size-1;i++)  //遍历数组
	{
		T min_val=ary[i];      //设当前元素为最小值
		int k=i;               //记录当前位置
		for(int j=i+1;j<size;j++)   //遍历未排序元素
		{
			if(ary[j]<min_val) //如果未排序的元素比当前最小值还小
			{
				min_val=ary[j];//更新最小值
				k=j;           //记录当前最小值的位置
			}
		}
		if(k!=i)      //如果最小元素不是当前元素
		{
			ary[k]=ary[i]; //交换当前元素与最小元素的值
			ary[i]=min_val;
		}
	}
}
template<int size>
void sort_array(char* (&ary)[size]) //数组排序模板针对字符串数组的特化
{
	for(int i=0;i<size-1;i++)       //遍历数组
	{
		char* pmin_val=ary[i];      //设当前字符串为最小字符串
		for(int j=i+1;j<size;j++)   //遍历未排序字符串
		{
			if(strcmp(ary[j],pmin_val)<0) //如果未排序字符串小于当前最小字符串
			{
				pmin_val=ary[j];    //记录新的最小字符串的位置
			}
		}
		if(pmin_val!=ary[i])        //如果最小字符串不是当前字符串
		{
			char* temp=new char[strlen(ary[i])+1];
			strcpy(temp,ary[i]);  //保存当前字符串的内容
			strcpy(ary[i],pmin_val);//交换当前字符串与最小字符串的内容
			strcpy(pmin_val,temp);
			delete []temp;
		}
	}
}
int main()
{
	int iary[5]={4,2,5,3,1};   //定义整型数组
	sort_array(iary);        //调用函数模板，对整型数组排序
	for(int i=0;i<5;i++)
	{
		cout<<iary[i]<<" ";    //输出排序后的数组内容
	}
	cout<<endl;
	char* cary[3];      //定义字符串数组
	cary[0]=new char[4];   //为数组中的字符串动态的分配空间
	cary[0][0]='\0';     //初始化
	cary[1]=new char[4];
	cary[1][0]='\0';
	cary[2]=new char[4];
	cary[2][0]='\0';
	strcpy(cary[0],"bbb");  //为数组中的字符串赋值
	strcpy(cary[1],"aaa");
	strcpy(cary[2],"ccc");
	sort_array(cary);        //调用函数模板，对字符串数组排序
	cout<<cary[0]<<endl;     //输出排序后的结果
	cout<<cary[1]<<endl;
	cout<<cary[2]<<endl;
	delete cary[0];          //回收内存
	delete cary[1];
	delete cary[2];
	return 0;
}