ordenaÇÃo em tempo linear. ordenação em tempo linear algoritmos de ordenação por comparação:...
Post on 07-Apr-2016
233 Views
Preview:
TRANSCRIPT
ORDENAÇÃO EM TEMPO LINEAR
Ordenação em Tempo Linear• Algoritmos de ordenação por comparação:
• InsertSort;• Quicksort;• MergeSort;• Heapsort...
• Possuem limite assintótico inferior: O(n lg n);
• Podem existir algoritmos melhores?
Ordenação em Tempo Linear• A resposta é SIM, desde que:
• A entrada possua características especiais;• Algumas restrições sejam respeitadas;• O algoritmo não seja puramente baseado em
comparações;• A implementação seja feita da maneira adequada.
• Tempo linear: Θ(n);• Algoritmos:
• Ordenação por contagem (Counting sort);• Radix sort;• Bucket sort.
ORDENAÇÃO POR CONTAGEM
Counting Sort
COUNTING SORT• Aspectos Positivos:
• Ordena vetores em tempo linear para o tamanho do vetor inicial;
• Não realiza comparações;• É um algoritmo de ordenação estável;
• Aspecto Negativo:• Necessita de dois vetores adicionais para sua
execução, utilizando, assim, mais espaço na memória.
COUNTING SORT• Funcionamento:
• A ordenação por contagem pressupõe que cada um dos n elementos do vetor de entrada é um inteiro entre 1 e k (k representa o maior inteiro presente no vetor).
• A ideia básica é determinar, para cada elemento de entrada x, o numero de elementos menores ou iguais a x. Com essa informação é possível determinar exatamente onde o elemento x será inserido.
EXEMPLO
Na lista A acima o elemento circulado 7 possui 5 elementos menores que ele. Dessa forma o elemento 7 deverá ser inserido no índice 6 (5 + 1) do vetor de saída B.
5 9 2 0 7 2 8 9 5A =
7B =
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
SIMULAÇÃO - COUNTING SORT
O algoritmo recebe um vetor desordenado como entrada:
Em seguida, gera os vetores adicionais B e C:
O vetor B é do mesmo tamanho do vetor A (8 elementos).
O vetor C é do tamanho do maior elemento de A + 1 (5 + 1 = 6).
0 0 0 0 0 0C = 0 1 2 3 4 5
B = 1 2 3 4 5 6 7 8
2 5 3 0 2 3 0 3A = 1 2 3 4 5 6 7 8
SIMULAÇÃO - COUNTING SORT
Se o valor de um elemento de entrada é i, incrementamos C[i]:
C[i] contém um número de elementos de entrada igual a i paracada i = 0,1,2,...,k.
2 0 2 3 0 1C = 0 1 2 3 4 5
Agora fazemos C[i] = C[i] + C[i-1] para determinarmos quantoselementos de entrada são menores que ou iguais a i:
2 2 4 7 7 8C = 0 1 2 3 4 5
SIMULAÇÃO - COUNTING SORT
Agora, partindo do maior para o menor índice, fazemosB[C[A[j]]] = A[j]. Assim, colocamos cada elemento A[j] em suaPosição ordenada no vetor B:
Para j = 8B[C[A[8]]] B[C[3]] B[7]B[7] = A[8] B[7] = 3
Exemplo:
SIMULAÇÃO - COUNTING SORT
Em seguida decrementamos o valor de C[A[j]] toda vez que Inserimos um valor no vetor B. isso faz com que o próximoelemento de entrada com valor igual a A[j], se existir, vá paraa posição imediatamente anterior a A[j] no vetor B.
C[3] = C[3] – 1:
2 2 4 7 7 8C = 0 1 2 3 4 5
2 2 4 6 7 8C = 0 1 2 3 4 5
SIMULAÇÃO - COUNTING SORT
Após as iterações de (comprimento de [A] até 1) temos o vetor desaída B ordenado!!!
0 0 2 2 3 3 3 5B = 1 2 3 4 5 6 7 8
ALGORITMO COUNTING SORT
01 CountingSort(A, B, k) {02 for I0 to k03 do C[i] 004 for j1 to comprimento [A]05 do C[A[j]] C[A[j]] + 106 for I2 to k07 do C[i] = C[i] + C[i-1]08 for j comprimento [A] downto 109 do B[C[A[j]]] = A[j]10 C[A[j]] = C[A[j]] - 111 }
COUNTING SORT IN Cvoid coutingSort(int *A, int n, int *B, int *C, int k){
int i; // Passo 1 - Contagem do número de cada elemento do intervalofor(i=0; i<n; i++) C[A[i]-1]++; // Passo 2 - Soma os números da casa atual, com os números da casa anteriorfor(i=1;i<k;i++) C[i] += C[i-1]; // Passo 3 - Alocação dos valores no vetor ordenadofor(i=n-1;i>=0;i--) { B[C[A[i]-1]-1] = A[i]; C[A[i]-1]--; } //Passo 4 - Passar o conteúdo do vetor final para o vetor original.for(i=0;i<n;i++) A[i] = B[i];
}
ORDENAÇÃO RADIXSORT
INTRODUÇÃO
Radixsort
Exercícios• Implementar os algoritmos RadixSort e CountSort
realizando experimentos que avaliem a quantidade de operações (comparações) e o tempo de execução para:
• vetores com 1.000, 10.000, 100.000 e um milhão de números inteiros entre 0 e 99.999. Os números inteiros serão gerados aleatoriamente.
top related