Optymilizacja sortowania bąbelkowego

0

Witam!
Czy istnieje możliwość zoptymalizowania podanego poniżej sortowania bąbelkowego? Fajnie jakby można było tych kilka funkcji umieścić w jednej, bardziej przejrzystej która zwracała by odpowiednią wartość w zależności od podanych argumentów.

 void sortowanie(uczen *s,int n,char zn)   // sortowanie wedlug sredniej
{ 
	uczen tmp;

if(zn=='r')
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].srednia < s[j+1].srednia)       
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
		}
	}
if (zn=='m')	
for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].srednia > s[j+1].srednia)       
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
		}
	}
}

void sortowanie2(uczen *s,int n,char zn)  // sortowanie wg nazwiska i imienia
{
	uczen tmp;
if(zn=='r')
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].nazwisko < s[j+1].nazwisko) /
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
			if(s[j].nazwisko == s[j+1].nazwisko)
			{
				if(s[j].imie > s[j+1].imie)
				{
					tmp = s[j+1];
					s[j+1] = s[j];
					s[j] = tmp;
				}
			}
		}		
	}
	if(zn=='m')
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].nazwisko > s[j+1].nazwisko)
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
			if(s[j].nazwisko == s[j+1].nazwisko)
			{
				if(s[j].imie < s[j+1].imie)
				{
					tmp = s[j+1];
					s[j+1] = s[j];
					s[j] = tmp;
				}
			}
		}		
	}
}
void sortowanie3(uczen *s,int n,char zn)   // sortowanie wedlug klasy
{ 
	uczen tmp;
if(zn=='r')
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].klasa < s[j+1].klasa) /
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
		}
	}
if(zn=='m')
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].klasa > s[j+1].klasa)
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
		}
	}
}
0

Zrób sobie np klasę Sorter, a w niej metoda sortuj i metoda abstrakcyjna porównaj(). W ifie zamiast porównania wprost będziesz wywoływał metodę porównaj(elem1, elem2). Jeśli zwróci true to zamieniasz elementy miejscami.

Załóżmy, że mamy metodę bool porównaj(T& elem1, T& elem2); Wtedy jej ciało w poszczególnych przypadkach będzie wyglądać tak:

  1. return elem1.srednia < elem2.srednia
  2. return elem1.srednia > elem2.srednia
  3. return elem1.nazwisko == elem2.nazwisko ? elem1.nazwisko < elem2.nazwisko : elem1.imie > elem2.imie;
  4. return elem1.nazwisko == elem2.nazwisko ? elem1.nazwisko > elem2.nazwisko : elem1.imie < elem2.imie;
  5. return elem1.klasa < elem2.klasa
  6. return elem1.klasa > elem2.klasa
0

Jestem początkujący więc brzmi to dość ekstremalnie ale postaram się zapoznać bliżej z tematem i iść Twoim tropem. Dziękuje za pomoc. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1