#include <iostream>

using namespace std;

// definicja szablonu funkcji
template<class T>
void sortuj(T *tab, int rozm)
{
	T tmp;
	for (int i=0; i<rozm; i++)
		for (int j=0; j<rozm-1; j++)
			if (tab[j]>tab[j+1]) {
				tmp = tab[j];
				tab[j] = tab[j+1];
				tab[j+1] = tmp;
			}
}

// definicja szablonu funkcji
// w definicji szablonu typename T i class T sa tozsame
template<typename T>
void wypisz(T *tab, int rozm)
{
	for (int i=0; i<rozm; i++)
		cout << tab[i] << " , ";
	cout << endl;
}

int main()
{
	int i;
	int t1[4];
	double t2[5];
	for (i=0; i<4; i++) {
		t1[i] = 5-i;
		t2[i] = 6-i;
	}
	t2[4] = 1;
	
	// kompilator generuje wypisz dla T = int
	wypisz<int>(t1, 4); 
	
	// kompulator generuje wypisz dla T = double
	wypisz<double>(t2, 5); 

	// kompilator generuje sortuj dla T = int
	sortuj<int>(t1, 4);

	// kompilator generuje sortuj dla T = double
	sortuj<double>(t2, 5);

	wypisz<int>(t1, 4);
	wypisz<double>(t2, 5);

	return 0;
}

