//sortowanie zliczeniowe
void sortowanieZliczeniowe(int* tablica, int rozmiar)
{
int min = tablica[0];
int max = tablica[0];
for(int i = 1; i < rozmiar; i++)
{
if(min > tablica[i])
{
min = tablica[i];
}
if(max < tablica[i])
{
max = tablica[i];
}
}
int* wartosci = new int[max - min + 1];
for(int i = min; i <= max; i++)
{
wartosci[i - min] = 0;
}
for(int i = 0; i < rozmiar; i++)
{
wartosci[tablica[i] - min]++;
}
int j = 0;
for(int i = min; i <= max; i++)
{
while(wartosci[i - min] > 0)
{
tablica[j] = i;
j++;
wartosci[i - min]--;
}
}
delete [] wartosci;
wartosci = 0;
}
//sortowanie kubełkowe
void sortowanieKubelkowe(int* tablica, int rozmiar)
{
int min = tablica[0];
int max = tablica[0];
for(int i = 1; i < rozmiar; i++)
{
if(min > tablica[i])
{
min = tablica[i];
}
if(max < tablica[i])
{
max = tablica[i];
}
}
int przedzial = (int)sqrt(max - min);
if(przedzial == 0)
{
przedzial = 1;
}
int ile = (int)((max - min)/przedzial)+1;
int *rozmiary = new int[ile];
int *indeksy = new int[ile];
int **kubelki = new int*[ile];
int ktory;
for(int i = 0; i < ile ;i++)
{
rozmiary[i] = 0;
indeksy[i] = 0;
}
for(int i = 0; i < rozmiar; i++)
{
ktory = (int)((tablica[i] - min)/przedzial);
rozmiary[ktory]++;
}
for(int i = 0; i < ile; i++)
{
if(rozmiary[i] > 0)
{
kubelki[i] = new int[rozmiary[i]];
}
}
for(int i = 0;i < rozmiar; i++)
{
ktory = (int)((tablica[i] - min)/przedzial);
kubelki[ktory][indeksy[ktory]] = tablica[i];
indeksy[ktory]++;
}
for(int i = 0; i < ile; i++)
{
if( (rozmiary[i] > 1)&&(!sprawdzTablice(kubelki[i],rozmiary[i]) ) )
{
if(przedzial > 100)
{
sortowanieKubelkowe(kubelki[i],rozmiary[i]);
} else {
sortowanieZliczeniowe(kubelki[i],rozmiary[i]);
}
}
}
int index = 0;
for(int i = 0; i < ile; i++)
{
for(int j = 0; j < rozmiary[i]; j++)
{
tablica[index] = kubelki[i][j];
index++;
}
}
for(int i = 0; i < ile; i++)
{
if(rozmiary[i] > 0)
{
delete [] kubelki[i];
kubelki[i] = 0;
}
}
delete [] kubelki;
kubelki = 0;
delete [] rozmiary;
rozmiary = 0;
delete [] indeksy;
indeksy = 0;
}