Algorytmy

Sortowanie przez zliczanie

Sortowanie przez zliczanie – metoda sortowania danych, która polega na sprawdzeniu ile wystąpień kluczy mniejszych od danego występuje w sortowanej tablicy. Algorytm zakłada, że klucze elementów należą do skończonego zbioru (np. są to liczby z całkowite przedziału X..Y), co ogranicza możliwości jego zastosowania. Główną zaletą tej metody jest liniowa złożoność obliczeniowa algorytmu – O(n+z) (n – oznacza liczebność zbioru, z – rozpiętość danych, czyli w przypadku liczb całkowitych: powiększoną o 1 różnicę między maksymalną, a minimalną wartością, np. rozpiętość liczb w skali ocen (0-10) wynosi (10-0) + 1 =11) Największymi ograniczeniami algorytmu są konieczność uprzedniej znajomości zakresu danych i złożoność pamięciowa (wymaga dodatkowo O(z) pamięci) . Algorytm możemy zawsze zmodyfikować by przechowywał dane na dysku twardym komputera lecz wtedy stracimy na wydajności co będzie spowodowane maksymalną przepustowością  dysku co przy dzisiejszych dyskach SSD stanowi mniejsze ograniczenie w porównaniu do dysków HDD.

Zasada działania
Polega na liczeniu, ile razy dana liczba występuje w ciągu, który mamy posortować. Następnie tworzymy nowy ciąg, korzystając z danych zebranych wcześniej. Posortujmy ciąg {6,2,1,4,2,1,3}
cout_sort_example.png

Dane wejściowe
d[] – zbiór elementów do posortowania. Każdy element posiada pole klucz, wg którego dokonuje się sortowania. Pole klucz jest liczbą całkowitą.  Indeksy elementów rozpoczynają się od 1.

n    – ilość elementów w zbiorze d[].

kmin - minimalna  wartość klucza.

kmax - maksymalna wartość klucza.

Dane wyjściowe

b[] – zbiór z posortowanymi elementami ze zbioru d[]. Indeksy elementów                  rozpoczynają się od 1.

Zmienne pomocnicze

i – zmienna dla pętli iteracyjnych

L[] -tablica liczników wartości kluczy. Elementy są liczbami całkowitymi.                  Indeksy przybierają kolejne wartości od k_min do k_max.

Lista kroków
1: Dla i=k_min, k_min+1,…,k_max: wykonuj L[i]=0;

2: Dla  i=1,2,…,n: wykonuj L[d[i].klucz]==L[d[i].klucz]+1;

3:Dla   i=k_min + 1, k_min+2,…,k_max:wykonuj L[i]=L[i]+L[i-1]

4: Dla i=n,n-1,…,1: wykonuj krok 5…6

5: b[L[D[i].klucz]] =d[i]

6:  L[d[i].klucz]=L[d[i].klucz]-1

7: Zakończ


couting_sort.jpg

Kod źródłowy funkcji sortującej dane typu całkowitego int w języku C++.

struct dane {
 
unsigned klucz;
 
char wyraz[3];
 
} d[N],b[N];
 
void countig_sort(int KMIN,int KMAX, int N, int * L[], dane * d[], dane * b[])
{
//Zerujemy liczniki
for(i = KMIN; i <= KMAX; i++) L[i - KMIN] = 0;
//Zliczamy wystąpienia kluczy
for(i = 0; i < N; i++) L[d[i].klucz - KMIN]++;
//Obliczamy pozycje końcowe
for(i = KMIN + 1; i <= KMAX; i++) L[i - KMIN] += L[i - KMIN - 1]; 
// Przepisujemy elementy z d[] do b[]
for(i = N - 1; i >= 0; i–) b[(L[d[i].klucz - KMIN]) - 1] = d[i];
} 


Chcesz być na bieżąco ?

LIKEPolub nas!