Professional Documents
Culture Documents
COUNTING SORT
Joinville
Novembro 2015
Explicao geral
Seja o vetor v desordenado de tamanho n:
v[0]
v[1]
v[2]
... v[n-2]
v[n-1]
v[n]
O Funcionamento
O CountingSort faz uso de 3 vetores:
vetA: um vetor de tamanho n que ser o vetor a ser ordenado;
vetB: um vetor de tamanho n que ser o vetor utilizado para a ordenao
dos elementos;
vetC: um vetor de tamanho k (valor do maior elemento do vetor de
entrada), que ser utilizado para a contagem da quantidade de vezes que
cada elemento aparece no vetor de entrada e a posio onde ele deve ser
inserido no vetor ordenado.
O mtodo pode ser dividido em X passos: Inicializao dos vetores, contagem do
nmero de ocorrncias de cada elemento, contagem da quantidade de nmeros
menores e ordenao.
1.
Inicializao
Esse passo extremamente simples: O vetor vetA contm os elementos
desordenados e os vetores vetB e vetC devem ser inicializados com 0.
2.
Contagem de ocorrncias
Nesse passo feita a contagem de quantas vezes cada elemento do vetor
de entrada aparece.
Ex: No vetor A, o nmero 1 aparece uma vez apenas, portanto o valor da
posio 0 do vetor C ser 1. O nmero 2 aparece quatro vezes, portanto o
valor da posio 1 do vetor C ser 4, e assim por diante.
4.
Ordenao
Agora o algoritmo vai percorrendo o vetor A do seu m at o inicio e
ordenando os nmeros no vetor B.
Obs: No cdigo esse ultimo passo pode ser traduzido como um for de N-1
at 0, f azendo o calculo: B[ --C[ A[i] ] = A[i];
Aspectos positivos
No realiza comparaes;
Aspectos Negativos
Necessita de dois vetores adicionais para sua execuo, utilizando, assim, mais
espao na memria.
Aspectos negativos:
gs
tocha
armrio
vincola
dado
boca
Associando os nmeros
0
hlice
gs
tocha
armrio
vincola
dado
boca
Contagem de Ocorrncias
0
1
1
1
1
1
Obs: Note que o vetor tem o tamanho do maior nmero
associado: 6
hlice
gs
tocha
armrio
vincola
dado
boca
Ordenao
Passo 1 vetor A
vetor B
0
boca
vetor C
0
1
Passo 2
vetor A
0
hlice
gs
tocha
armrio
vincola dado
boca
vetor B
0
boca
dado
vetor C
0
1
1
Aps os outros
passos
vetor A
hlice
gs
tocha
6
armrio
1
vincola dado
7
boca
2
vetor B
0
armrio
vetor C
boca
dado
gs
hlice
tocha
vincola
Complexidade
O cdigo que ordena o vetor A com o mtodo CountingSort :
typedef struct
{
int number; char palavra[50];
}CountingSort;
CountingSort Base[MAX];
CountingSort VectorSort[MAX]; int aux[MAX];
void CountingSortIni()
{
int i = 0;
//inicia o vetor auxiliar for(i = 0; i <MAX;i++)
aux[i]=0;
// guarda no vetor auxiliar quantas vezes um ndice esta contido
no vetor Base for(i = 0; i < MAX;i++)
aux[Base[i].number]++;
//guarda em cada posio do vetor auxiliar a verdadeira posio
do ndice for(i = 0;i<(MAX-1);i++)
aux[i+1]+=aux[i];
//ordena os indices do nal para o inicio for(i = MAX- 1;i >= 0;i--)
VectorSort[--aux[Base[i].number]] = Base[i];
}
Clculo da Complexidade
Vamos Dividir o cdigo em 3 partes sendo cada uma delas um
for: de modo que a complexidade ser:
(n) = (n) + (n) + (n) + (n)
Complexidade (n):
aux[i]=0; Comparaes = n
Incremento = n
Operaes = 3
(n) = 1 + 3*n
Complexidade (n):
Inicializao = 1
Comparaes = n
Complexidade (n):
Incremento = n
Operaes = 3
Complexidade (n):
Inicializao = 1
Comparaes = n-1
Incremento = n-1
Operaes = 3
(n) = 1 + 3*( n-1)
Inicializao = 1
Comparaes = n
Incremento = n
Operaes = 4
(n) = 1 + 4*n
Cdigo
include <stdio.h>
include <string.h>
include <stdlib.h>
include <ctype.h> #include<time.h>
}CountingSort;
CountingSort Base[MAX]; CountingSort VectorSort[MAX]; int
aux[MAX];
void CountingSortIni()
{
int i = 0;
//inicia o vetor auxiliar for(i = 0; i <MAX;i++)
aux[i]=0;
// guarda no vetor auxiliar quantas vezes um indice esta contido no
vetor Base for(i = 0; i < MAX;i++)
aux[Base[i].number]++;
//guarda em cada posio do vetor auxiliar a verdadeiar posio do
indice for(i = 0;i<(MAX-1);i++)
inicio
int numero=0,i=0;
double i1=0.0,f1=0.0;
//pega do arquivo o tamanho e a palavra while(!feof(arq))
{
fscanf(arq,"%s %d",pal,&numero); strcpy(Base[i].palavra,pal); Base
[i].number=numero;
i++;
}
i1=clock();
CountingSortIni();
f1=clock();
printf("Tempo Counting Sort: %lf ",(f1-i1)); system
("pause");
fclose(arq); return 0;
Resultados
Simulao