O documento descreve o algoritmo de ordenação QuickSort, que utiliza a técnica de divisão e conquista. QuickSort divide o arranjo de entrada em dois sub-arranjos, ordena os sub-arranjos recursivamente e combina os resultados para ordenar o arranjo completo. O particionamento do arranjo é a etapa chave que divide o problema em subproblemas menores.
O documento descreve o modelo incremental para projetar algoritmos de ordenação por indução fraca. Ele apresenta o padrão geral seguido por algoritmos incrementais, que ordenam incrementalmente subconjuntos de tamanho crescente dos dados de entrada. Como exemplo, é descrito o algoritmo de inserção, que ordena um conjunto de tamanho n inserindo recursivamente o elemento restante em um conjunto já ordenado de tamanho n-1.
O documento discute a análise de algoritmos e complexidade. Analisar um algoritmo envolve prever os recursos necessários, como tempo e espaço. A análise de algoritmos estuda a eficiência de algoritmos, seja no tempo ou espaço, e busca identificar o algoritmo de menor custo possível para um problema. Isso permite definir limites de complexidade e medir a dificuldade de problemas.
1) O documento discute as notações Ω, ω e Θ para análise assintótica de algoritmos, que fornecem limites inferiores e superiores para a taxa de crescimento de funções.
2) A notação Ω descreve um limite inferior, significando que a função cresce no mínimo tão lentamente quanto outra função. Já a notação ω indica que uma função cresce mais rápido que outra quando n tende ao infinito.
3) Exemplos ilustram como determinar se uma função pertence ou não a Ω ou ω de
O documento discute métodos para resolver relações de recorrência, que descrevem o custo de algoritmos recursivos. Ele explica que o método da expansão substitui termos menores na relação até obter uma fórmula fechada contendo apenas o primeiro termo, encontrando assim a solução geral da relação de recorrência.
O documento discute como a indução e a recursão podem ajudar no desenvolvimento de algoritmos. Primeiramente, explica-se que a prova por indução matemática é, por si só, um algoritmo recursivo. Em seguida, utiliza-se o exemplo do cálculo fatorial para ilustrar como a indução finita pode levar à construção de um algoritmo recursivo, definindo a base, hipótese de indução e passo recursivo.
O documento descreve o algoritmo de ordenação QuickSort, que utiliza a técnica de divisão e conquista. QuickSort divide o arranjo de entrada em dois sub-arranjos, ordena os sub-arranjos recursivamente e combina os resultados para ordenar o arranjo completo. O particionamento do arranjo é a etapa chave que divide o problema em subproblemas menores.
O documento descreve o modelo incremental para projetar algoritmos de ordenação por indução fraca. Ele apresenta o padrão geral seguido por algoritmos incrementais, que ordenam incrementalmente subconjuntos de tamanho crescente dos dados de entrada. Como exemplo, é descrito o algoritmo de inserção, que ordena um conjunto de tamanho n inserindo recursivamente o elemento restante em um conjunto já ordenado de tamanho n-1.
O documento discute a análise de algoritmos e complexidade. Analisar um algoritmo envolve prever os recursos necessários, como tempo e espaço. A análise de algoritmos estuda a eficiência de algoritmos, seja no tempo ou espaço, e busca identificar o algoritmo de menor custo possível para um problema. Isso permite definir limites de complexidade e medir a dificuldade de problemas.
1) O documento discute as notações Ω, ω e Θ para análise assintótica de algoritmos, que fornecem limites inferiores e superiores para a taxa de crescimento de funções.
2) A notação Ω descreve um limite inferior, significando que a função cresce no mínimo tão lentamente quanto outra função. Já a notação ω indica que uma função cresce mais rápido que outra quando n tende ao infinito.
3) Exemplos ilustram como determinar se uma função pertence ou não a Ω ou ω de
O documento discute métodos para resolver relações de recorrência, que descrevem o custo de algoritmos recursivos. Ele explica que o método da expansão substitui termos menores na relação até obter uma fórmula fechada contendo apenas o primeiro termo, encontrando assim a solução geral da relação de recorrência.
O documento discute como a indução e a recursão podem ajudar no desenvolvimento de algoritmos. Primeiramente, explica-se que a prova por indução matemática é, por si só, um algoritmo recursivo. Em seguida, utiliza-se o exemplo do cálculo fatorial para ilustrar como a indução finita pode levar à construção de um algoritmo recursivo, definindo a base, hipótese de indução e passo recursivo.
O documento descreve a técnica de endereçamento direto para implementar dicionários dinâmicos. Ele explica como mapear chaves diretamente para posições de um array, permitindo buscas, inserções e remoções em tempo constante. No entanto, essa abordagem funciona bem apenas para conjuntos pequenos de chaves, pois pode ocorrer colisões para conjuntos maiores.
O documento descreve o algoritmo de ordenação por contagem (counting sort). Ele ordena vetores em tempo linear sem usar comparações, mas requer dois vetores adicionais de espaço na memória. O algoritmo conta o número de ocorrências de cada elemento e usa essas contagens para determinar as posições dos elementos ordenados no vetor de saída.
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempoDelacyr Ferreira
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
O documento discute técnicas de inferência como dedução, indução e abdução e como elas se relacionam com o desenvolvimento de algoritmos. Explica que a indução finita pode ser usada para provar conjecturas sobre a correção de algoritmos de forma dedutiva, ao invés do raciocínio indutivo incerto.
O documento discute ponteiros em linguagem C, incluindo: 1) O que são ponteiros e porque são usados; 2) Como declarar variáveis ponteiros; 3) Operadores de ponteiros como & e *; 4) Expressões com ponteiros como atribuição e aritmética de ponteiros; 5) Como ponteiros se relacionam com matrizes para acessar elementos e varredura de matrizes.
Este documento apresenta os seguintes tópicos:
1) Revisão de algoritmos, estruturas de dados e pseudocódigo;
2) Estrutura básica de algoritmos em pseudocódigo, incluindo entrada, processamento e saída de dados;
3) Operadores aritméticos e teste de mesa para depuração de algoritmos.
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
Mais conteúdo relacionado
Semelhante a (ACH2002) Introdução à Análise de Algoritmos - Aula 18
O documento descreve a técnica de endereçamento direto para implementar dicionários dinâmicos. Ele explica como mapear chaves diretamente para posições de um array, permitindo buscas, inserções e remoções em tempo constante. No entanto, essa abordagem funciona bem apenas para conjuntos pequenos de chaves, pois pode ocorrer colisões para conjuntos maiores.
O documento descreve o algoritmo de ordenação por contagem (counting sort). Ele ordena vetores em tempo linear sem usar comparações, mas requer dois vetores adicionais de espaço na memória. O algoritmo conta o número de ocorrências de cada elemento e usa essas contagens para determinar as posições dos elementos ordenados no vetor de saída.
Análise de Algoritmos - Problemas, instâncias, algoritmos e tempoDelacyr Ferreira
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
O documento discute técnicas de inferência como dedução, indução e abdução e como elas se relacionam com o desenvolvimento de algoritmos. Explica que a indução finita pode ser usada para provar conjecturas sobre a correção de algoritmos de forma dedutiva, ao invés do raciocínio indutivo incerto.
O documento discute ponteiros em linguagem C, incluindo: 1) O que são ponteiros e porque são usados; 2) Como declarar variáveis ponteiros; 3) Operadores de ponteiros como & e *; 4) Expressões com ponteiros como atribuição e aritmética de ponteiros; 5) Como ponteiros se relacionam com matrizes para acessar elementos e varredura de matrizes.
Este documento apresenta os seguintes tópicos:
1) Revisão de algoritmos, estruturas de dados e pseudocódigo;
2) Estrutura básica de algoritmos em pseudocódigo, incluindo entrada, processamento e saída de dados;
3) Operadores aritméticos e teste de mesa para depuração de algoritmos.
Semelhante a (ACH2002) Introdução à Análise de Algoritmos - Aula 18 (9)
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
O documento descreve as bases de dados em lógica de primeira ordem, como interagir com elas fazendo buscas (queries) por meio de sentenças lógicas em LPO, e como qualquer query que possa ser inferida logicamente pela base de dados será respondida afirmativamente. As bases de dados contêm axiomas com informações básicas e teoremas derivados dos axiomas, e o documento discute técnicas como forward chaining, backward chaining e resolução para realizar inferência nas bases de dados.
O documento descreve uma aula sobre lógica de primeira ordem. Apresenta os elementos básicos da lógica de primeira ordem, incluindo termos, predicados e a gramática formal para construir sentenças. Também explica como modelos e interpretações funcionam na lógica de primeira ordem, diferentemente da lógica proposicional.
O documento discute inferência em lógica proposicional, incluindo tipos de provas como verificação de modelos e aplicação de regras de inferência. Ele explica como aplicar regras de inferência como modus ponens e modus tollens para derivar novas sentenças a partir de premissas, formando uma prova.
O documento descreve um algoritmo de busca retroativa para resolver problemas de satisfação de restrições, utilizando forward checking e heurísticas como valores restantes mínimos, grau e valor menos restritivo. O algoritmo é demonstrado passo a passo em um exemplo de coloração de grafos, definindo variáveis, valores e propagando escolhas.
O documento descreve problemas de satisfação de restrições (CSPs), definidos por um conjunto de variáveis, domínios de valores para cada variável, e restrições sobre combinações de valores de variáveis. Apresenta exemplos de agendamento de aulas e coloração de mapas como CSPs, definindo suas variáveis, domínios e restrições.
O documento discute algoritmos genéticos e representação de cromossomos. Ele explica que os cromossomos podem ser representados de várias formas, incluindo binária, valores inteiros e reais. A representação binária é a mais simples, onde o cromossomo consiste de uma sequência de bits. A mutação e o cruzamento ocorrem durante o algoritmo genético para gerar novas soluções.
PP Slides Lição 11, Betel, Ordenança para exercer a fé, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, Betel, Ordenança para exercer a fé, 2Tr24, Pr Henrique, EBD NA TV, 2° TRIMESTRE DE 2024, ADULTOS, EDITORA BETEL, TEMA, ORDENANÇAS BÍBLICAS, Doutrina Fundamentais Imperativas aos Cristãos para uma vida bem-sucedida e de Comunhão com DEUS, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Comentários, Bispo Abner Ferreira, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
(ACH2002) Introdução à Análise de Algoritmos - Aula 18
1. Aula 18 – Algoritmos de Ordena¸c˜ao:
CountingSort e RadixSort
Norton Trevisan Roman
norton@usp.br
25 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 1 / 18
2. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
3. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
4. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
5. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
6. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Veremos que n˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
7. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Veremos que n˜ao
Se conseguirmos ter alguma informa¸c˜ao que nos
ajude, podemos fazer algoritmos melhores
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
9. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
10. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
11. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
12. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Usar essa informa¸c˜ao para colocar x diretamente em sua
posi¸c˜ao no arranjo de sa´ıda
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
13. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Usar essa informa¸c˜ao para colocar x diretamente em sua
posi¸c˜ao no arranjo de sa´ıda
Precisamos, no entanto, tomar cuidado para n˜ao incluirmos
elementos de mesmo valor na mesma posi¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
15. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
16. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
17. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
B[1..n]: guardar´a a sa´ıda ordenada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
18. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
B[1..n]: guardar´a a sa´ıda ordenada
C[0..k]: para armazenar o n´umero de ocorrˆencias de cada
elemento i de A (0 ≤ i ≤ k)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
19. Counting Sort
Implementa¸c˜ao
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
20. Counting Sort
Implementa¸c˜ao
Arranjo de entrada
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
21. Counting Sort
Implementa¸c˜ao
Valor do maior elemento em
A (ou algum outro limitante)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
22. Counting Sort
Implementa¸c˜ao
Fazemos C[i] conter
o n´umero de elementos
em A que s˜ao iguais a i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
23. Counting Sort
Implementa¸c˜ao
Repare que os valores
em A v˜ao de 0 a k, as-
sim como os ´ındices de
C (e que os ´ındices est˜ao
naturalmente ordenados)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
24. Counting Sort
Implementa¸c˜ao
Agora fazemos C[i] con-
ter o n´umero de elemen-
tos em A que s˜ao ≤ i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
25. Counting Sort
Implementa¸c˜ao
Colocamos cada elemento de
A na posi¸c˜ao correta em B
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
26. Counting Sort
Implementa¸c˜ao
Cuidamos de n˜ao incluir
novamente os repetidos
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
27. Counting Sort
Implementa¸c˜ao
O −1 ´e para mapear a
contagem ao ´ındice em B
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
28. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
29. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
30. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
C
0 1 2 3 4 5
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
31. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
32. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 0 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
33. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 0 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
34. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
35. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
36. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
37. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
38. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
39. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
40. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
41. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
42. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
43. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
44. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
45. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
46. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
47. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
48. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
49. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
50. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
51. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
52. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
53. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
54. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
55. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
56. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
57. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
58. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
59. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
60. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
61. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
62. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
63. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
64. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
65. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
66. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
67. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
68. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
69. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
70. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
71. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
72. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
73. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
74. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
75. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
76. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
77. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
78. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
79. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
80. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
81. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
82. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
83. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
84. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
85. Counting Sort
Complexidade
E qual a
complexidade
disso?
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
86. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
87. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
88. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
89. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
+O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
90. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
+O(n)
O(n + k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
91. Counting Sort
Complexidade
O(n + k) int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
92. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
93. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
k = O(n) significa que k
´e constante ou, no
m´aximo, linearmente
proporcional a n
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
94. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
k = O(n) significa que k
´e constante ou, no
m´aximo, linearmente
proporcional a n
Essa ´e a limita¸c˜ao do
algoritmo
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
95. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
96. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
97. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
98. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Em vez disso, ele usa esses valores para indexar o arranjo C
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
99. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Em vez disso, ele usa esses valores para indexar o arranjo C
Por isso o limite Ω(n log n) n˜ao se aplica
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
100. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
101. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
102. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
103. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Que dependem da ordem do dado em rela¸c˜ao aos que tˆem o
mesmo valor no arranjo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
104. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Que dependem da ordem do dado em rela¸c˜ao aos que tˆem o
mesmo valor no arranjo
Mais adiante veremos um exemplo de onde isso ´e
importante...
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
105. Radix Sort
Radix Sort
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 11 / 18
107. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
108. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
109. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
110. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Note que cada elemento da entrada ter um
comprimento m´aximo constante o torna
independente de n
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
111. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Note que cada elemento da entrada ter um
comprimento m´aximo constante o torna
independente de n
Independente do tamanho da pr´opria entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
113. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
114. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
115. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
116. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
117. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
118. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
119. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
121. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
122. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
De modo a manter a ordem dos d´ıgitos menos significativos
j´a ordenados
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
123. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
De modo a manter a ordem dos d´ıgitos menos significativos
j´a ordenados
Ex: Counting Sort e QuickSort (se implementado para tal)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
124. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
125. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
126. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
127. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)×O(f (n)), onde O(f (n)) ´e a complexidade do
algoritmo de ordena¸c˜ao usado
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
128. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)×O(f (n)), onde O(f (n)) ´e a complexidade do
algoritmo de ordena¸c˜ao usado
Se este for o Counting Sort, em sua vers˜ao linear, ent˜ao
O(f (n)) = O(n), e o Radix Sort ser´a O(n)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
129. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
130. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
131. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
132. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Podemos usar um algoritmo de ordena¸c˜ao cuja fun¸c˜ao de
compara¸c˜ao retorne a maior de duas dadas, comparando ano e, em
caso de empate, mˆes e, em caso de empate, dia
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
133. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Podemos usar um algoritmo de ordena¸c˜ao cuja fun¸c˜ao de
compara¸c˜ao retorne a maior de duas dadas, comparando ano e, em
caso de empate, mˆes e, em caso de empate, dia
Ou ordenar a informa¸c˜ao 3 vezes com um m´etodo est´avel de
ordena¸c˜ao: primeiro no dia, em seguida no mˆes, e ent˜ao no ano
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
134. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
135. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
136. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
137. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Tem complexidade linear
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
138. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Tem complexidade linear
N˜ao ´e in-place, criando diversos arranjos auxiliares na
mem´oria
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
139. Referˆencias
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
https://www.geeksforgeeks.org/radix-sort/
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 18 / 18