Difference between revisions of "Counting Sort"

From Wiki**3

 
 
Line 9: Line 9:
 
* dois ciclos em M
 
* dois ciclos em M
 
* três ciclos em N
 
* três ciclos em N
 +
Espaço adicional: O(N+M)
  
 
=== Primeira versão ===
 
=== Primeira versão ===
  
   void countingsort(int a[], int l, int r) {
+
   void '''countingsort'''(int a[], int l, int r) {
 
     int i, j, cnt[M+1];  
 
     int i, j, cnt[M+1];  
 
     int b[maxN];
 
     int b[maxN];
Line 24: Line 25:
 
=== Segunda versão ===
 
=== Segunda versão ===
  
   void countingsort(int a[], int l, int r) {
+
   void '''countingsort'''(int a[], int l, int r) {
 
     int i, j, cnt[M];  
 
     int i, j, cnt[M];  
 
     int b[maxN];
 
     int b[maxN];

Latest revision as of 18:56, 27 May 2005

Introdução

  • Estável.
  • Explora o facto de as chaves estarem limitadas a um intervalo.

Implementação

Complexidade: O(N+M)

  • dois ciclos em M
  • três ciclos em N

Espaço adicional: O(N+M)

Primeira versão

 void countingsort(int a[], int l, int r) {
   int i, j, cnt[M+1]; 
   int b[maxN];
   for (j = 0; j <= M; j++) cnt[j] = 0;
   for (i = l; i <= r; i++) cnt[a[i]+1]++;
   for (j = 1; j <  M; j++) cnt[j] += cnt[j-1];
   for (i = l; i <= r; i++) b[cnt[a[i]]++] = a[i];
   for (i = l; i <= r; i++) a[i] = b[i];
 }

Segunda versão

 void countingsort(int a[], int l, int r) {
   int i, j, cnt[M]; 
   int b[maxN];
   for (j = 0; j <  M; j++) cnt[j] = 0;
   for (i = l; i <= r; i++) cnt[a[i]]++;
   for (j = 1; j <  M; j++) cnt[j] += cnt[j-1];
   for (i = r; i >= l; i--) b[--cnt[a[i]]] = a[i];
   for (i = l; i <= r; i++) a[i] = b[i];
 } 

Diferenças?