Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Counting Sort, Notas de estudo de Informática

Algoritmos de Ordenações

Tipologia: Notas de estudo

2015

Compartilhado em 28/09/2015

emerson-ribeiro-39
emerson-ribeiro-39 🇧🇷

4.9

(7)

4 documentos

1 / 3

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
1. Counting Sort
Ou Ordenação por Contagem é um algoritmo de ordenação estável, ou
seja, tem complexidade O(n). Ele não se baseia em comparações, e sim em
indexação. Para isso,os valores a serem ordenados devem ser inteiros, pois
estes serão usados como chaves no vetor auxiliar por ele requisitado (repare que
ele precisa de memória extra para trabalho, porém não é recursivo). Assim, este
algoritmo não funciona com entradas em ponto flutuantes, pois se usasse uma
lista encadeada, seu desempenho possivelmente não seria satisfatório, devido ao
percurso na lista para cada busca.
Ele necessita do valor do maior elemento k da entrada para criar o vetor
auxiliar de contagem dos elementos da entrada, cujos valores devem variar
desde 0 até k. Importante observar que O(k) deve ser linear para que o algoritmo
também o seja, o que acontece na prática.
1.2. Metodologia
O algoritmo realiza a contagem do número de elementos menores que
este, e assim, insere o elemento em sua posição já ordenado, ou seja, se em um
vetor a ser ordenado existem 15 elementos, e há 12 elementos menores que um
dado número x, então x pertence à posição 13.
Isso é feito utilizando outros dois vetores secundários, B e C, onde B é o
vetor ordenado, portanto tem o tamanho igual a A (o vetor a ser ordenado) e C é
um vetor auxiliar de tamanho k, onde k é o maior valor encontrado em A.
O algoritmo é formado por quatro laços de repetição que varrem ou o vetor
original ou o de trabalho. Primeiramente ele cria o vetor de trabalho e atribui zero
a todas as posições, consumindo O(k). Depois varre o vetor original e
incrementa as quantidades dos elementos da entrada no vetor de trabalho
utilizando a indexação. Assim, o tempo gasto é de apenas O(n), pois a indexação
consome tempo O(1).
1.3. Pseudocódigo e custo
Pseudocódigo Custo Comentário
COUNTING-SORT (A; B; n; k)
1 para i = 0 até k faça C[i] = 0 O(k) É criado um de trabalho e atribui o valor
zero à todas posições do vetor auxiliar
2 para j = 1 até n faça
C[A[j]] = C[A[j]] ++
O(n) Nessa etapa será feita a contagem do
número de cada elemento do intervalo.
Tipo, se o 1 aparece duas vezes, dentro
da casa 1 será feito o incremento duas
vezes.
3 para i = 1 até k faça
C[i] = C[i] + C[i - 1]
O(k) Agora será feito o complemento de
casas de cada valor. Ou seja, se na casa
1 existe um 3 (o número 1 se repete 3
vezes), os número da casa 2 só poderão
ser guardados a partir da casa 4, então
soma-se aos números da casa atual, os
números da casa anterior.
4 para j = n decrescendo até 1
faça
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
O(n) Agora será feito a alocação dos
valores no vetor ordenado. A regra é a
seguinte: faz-se a varredura do vetor
inicial do final para o começo, o valor de
A identifica o índice do vetor
complementar C e o valor do deste é o
pf3

Pré-visualização parcial do texto

Baixe Counting Sort e outras Notas de estudo em PDF para Informática, somente na Docsity!

  1. Counting Sort Ou Ordenação por Contagem é um algoritmo de ordenação estável, ou seja, tem complexidade O(n). Ele não se baseia em comparações, e sim em indexação. Para isso,os valores a serem ordenados devem ser inteiros, pois estes serão usados como chaves no vetor auxiliar por ele requisitado (repare que ele precisa de memória extra para trabalho, porém não é recursivo). Assim, este algoritmo não funciona com entradas em ponto flutuantes, pois se usasse uma lista encadeada, seu desempenho possivelmente não seria satisfatório, devido ao percurso na lista para cada busca. Ele necessita do valor do maior elemento k da entrada para criar o vetor auxiliar de contagem dos elementos da entrada, cujos valores devem variar desde 0 até k. Importante observar que O(k) deve ser linear para que o algoritmo também o seja, o que acontece na prática. 1.2. Metodologia O algoritmo realiza a contagem do número de elementos menores que este, e assim, insere o elemento em sua posição já ordenado, ou seja, se em um vetor a ser ordenado existem 15 elementos, e há 12 elementos menores que um dado número x, então x pertence à posição 13. Isso é feito utilizando outros dois vetores secundários, B e C, onde B é o vetor ordenado, portanto tem o tamanho igual a A (o vetor a ser ordenado) e C é um vetor auxiliar de tamanho k, onde k é o maior valor encontrado em A. O algoritmo é formado por quatro laços de repetição que varrem ou o vetor original ou o de trabalho. Primeiramente ele cria o vetor de trabalho e atribui zero a todas as posições, consumindo O(k). Depois varre o vetor original e incrementa as quantidades dos elementos da entrada no vetor de trabalho utilizando a indexação. Assim, o tempo gasto é de apenas O(n), pois a indexação consome tempo O(1).

1.3. Pseudocódigo e custo

N° Pseudocódigo Custo Comentário

COUNTING-SORT (A; B; n; k) 1 para i = 0 até k faça C[i] = 0 O(k) É criado um de trabalho e atribui o valor zero à todas posições do vetor auxiliar 2 para j = 1 até n faça C[A[j]] = C[A[j]] ++

O(n) Nessa etapa será feita a contagem do número de cada elemento do intervalo. Tipo, se o 1 aparece duas vezes, dentro da casa 1 será feito o incremento duas vezes. 3 para i = 1 até k faça C[i] = C[i] + C[i - 1]

O(k) Agora será feito o complemento de casas de cada valor. Ou seja, se na casa 1 existe um 3 (o número 1 se repete 3 vezes), os número da casa 2 só poderão ser guardados a partir da casa 4, então soma-se aos números da casa atual, os números da casa anterior. 4 para j = n decrescendo até 1 faça B[C[A[j]]] = A[j] C[A[j]] = C[A[j]] - 1

O(n) Agora será feito a alocação dos valores no vetor ordenado. A regra é a seguinte: faz-se a varredura do vetor inicial do final para o começo, o valor de A identifica o índice do vetor complementar C e o valor do deste é o

índice do vetor B, dentro do vetor B no índice apontado, será alocado o valor do índice A. 1.4. Código em C

#include <stdio.h> #include <stdlib.h>

int i = 0, j = 0;

int MAIOR_VALOR(int *Vetor_A, int tam){ int maior = 0;

for (i =0; i < tam; i++){ if (Vetor_A[i] > maior) maior = Vetor_A[i]; } return maior;

} // Fim_Função_MAIOR_VALOR

void COUNTING_SORT(int *A, int *B, int tam, int k){ int C[k]; // Declaração do vetor auxiliar

for(i = 0; i <= k; i++) C[i] = 0; // preenchendo o vetor C com zero for(j = 0; j < tam; j++) C[A[j]]= C[A[j]] + 1; // contagem cada elemento do intervalo for(i = 1; i <= k; i++) C[i] = C[i] + C[i-1]; // complemento de casas de cada valor

for(j = tam -1 ; j >= 0; j--) { // alocação dos valores no vetor ordenado int c = C[A[j]]; // recebe o valor do índice do vetor B B[c] = A[j]; // recebe o valor que ficará no índice C[A[j]] = C[A[j]] - 1; // decrementando o valor do vetor C[A[j]] }

} // Fim_função_COUNTING_SORT

int main() { int k = 0, tam = 0; int A[] = {2,5,3,0,2,3,0,5,3,0}; tam = sizeof(A) / sizeof(int); // cálculo do tamanho do vetor k = MAIOR_VALOR(A,tam); // cálculo do intervalo k printf("\nVetor A Desordenado:\n"); for(i = 0; i < tam; i++) printf("%d, ", A[i]); int B[tam]; // vetor ordenado COUNTING_SORT(A, B, tam, k); // Chamada da Função printf("\n\n\nVetor A Ordenado:\n"); for(i = 1; i <= tam; i++){ A[i] = B[i]; printf("%d, ", A[i]);