Classificação Métodos de Classificação Os métodos de classificação podem ser dos tipos: Classificação interna – quando toda a coleção de itens a classificar pode ficar armazenada em um “array” em memória Classificação externa – quando as coleções de itens são muito grandes para poder permanecer armazenadas em memória 2 Regiões classificada e não classificada Os métodos são iterativos e nos “arrays” de registros aparecem duas regiões: a região já classificada e a região de registros ainda não classificados. Em cada iteração vai crescendo a região classificada. O processo se encerra quando a região classificada abrange todo o “array”. 3 Métodos mais conhecidos Os métodos mais conhecidos são: Classificação por troca Classificação por seleção Classificação por inserção 4 Classificação por troca Na classificação por troca comparam-se dois elementos do “array” verificando se a posição relativa do antecessor e do sucessor obedecem ao critério de classificação especificado. Caso haja obediência ao critério de classificação nada é feito. Em caso contrário trocam-se as posições destes registros. Exemplos: Bubble Sort Shake Sort Quick Sort 5 Classificação por Inserção Na classificação por inserção em cada instante toma-se um elemento, o elemento corrente, do trecho ainda não classificado do “array” e faz-se a inserção deste elemento na posição correta do trecho já classificado. Em conseqüência reduz-se o trecho ainda não classificado e amplia-se o trecho já classificado. Exemplos: Inserção Simples Shell Sort 6 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 7 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 8 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 9 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 10 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 11 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 12 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 13 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 14 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 15 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 16 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 17 Exemplo de Inserção Simples Posição no “array” Vai para A inserir 0 0 1 1 0 2 3 3 0 4 5 5 2 6 3 7 7 8 2 9 - 0 30 30 30 30 8 8 7 7 7 7 7 7 1 42 42 42 42 30 30 8 8 8 8 8 8 2 8 8 8 8 42 42 30 30 13 13 13 11 3 55 55 55 55 55 55 42 42 30 20 20 13 4 7 7 7 7 7 7 55 55 42 30 30 20 5 90 90 90 90 90 90 90 90 55 42 42 30 6 13 13 13 13 13 13 13 13 90 55 55 42 7 20 20 20 20 20 20 20 20 20 90 71 55 8 71 71 71 71 71 71 71 71 71 71 90 71 9 11 11 11 11 11 11 11 11 11 11 11 90 18 Classificação por Seleção Na classificação por seleção, em cada instante seleciona-se do trecho ainda não classificado o elemento mais apropriado para ser acrescentado ao trecho já classificado. Em conseqüência reduz-se o trecho ainda não classificado e amplia-se o trecho já classificado. Exemplos: Seleção Direta Heap Sort 19 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 20 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 21 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 22 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 23 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 24 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 25 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 26 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 27 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 28 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 29 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 30 Exemplo de Seleção Direta Posição no “array” Selecionado Vai para 4 0 2 1 9 2 6 3 7 4 7 5 9 6 9 7 8 8 9 9 8 8 0 30 30 7 7 7 7 7 7 7 7 7 7 1 42 42 42 8 8 8 8 8 8 8 8 8 2 8 8 8 42 11 11 11 11 11 11 11 11 3 55 55 55 55 55 13 13 13 13 12 12 12 4 7 7 30 30 30 30 20 20 20 20 20 20 5 90 90 90 90 90 90 90 30 30 30 30 30 6 13 13 13 13 13 55 55 55 42 42 42 42 7 20 20 20 20 20 20 30 90 90 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 11 11 11 11 42 42 42 42 55 90 90 90 31 Exemplo de Quick Sort (1) Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" 0 4 1 2 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" 0 2 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" 0 0 11 11 7 7 1 1 20 20 20 8 (7+8)/2=7,5 0 1 0 1 7 8 7 8 0 1 0 1 2 2 8 8 8 20 2 3 3 13 13 13 13 3 ( 11 + 7) / 2 = 9 4 5 6 4 7 7 11 11 4 ( 20 + 11 )/2=15,5 2 3 4 0 1 2 20 13 11 20 13 11 11 13 20 11 2 0 11 11 3 4 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 (13+20)/2=16,5 0 1 2 3 0 13 13 4 1 20 20 32 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" 0 4 1 2 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" 0 1 2 3 4 5 0 ( 90 + 30 ) / 2 = 60 6 7 8 9 1 2 3 4 90 55 42 71 30 90 30 30 55 55 42 42 42 55 71 71 71 30 90 90 7 8 9 ( 55 + 90 )/2=72,5 7 8 0 1 9 2 (30+42)/2=36 0 1 2 3 4 5 0 6 1 30 42 30 42 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" Exemplo de Quick Sort (2) 0 0 1 1 2 2 3 3 4 4 5 5 6 6 55 71 90 55 71 90 55 7 0 8 9 55 55 Ponto de separação Posição no “array” Posição no novo“array” A trocar no novo "array" "array"classificado (71+90)/2=80,5 0 7 1 2 3 4 Resultado obtido 8 11 13 20 5 30 6 42 7 55 8 0 9 1 71 90 71 90 71 90 33 Exemplo de “Shell Sort” (1) Posição no “array” 0 30 1 42 2 8 3 55 4 7 5 90 6 13 7 20 8 71 9 11 3 20 4 30 5 42 6 13 7 55 8 71 9 90 Intervalo 4 - Classificar por inserção Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 0 2 2 Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 1 2 0 Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 1 Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 0 0 0 30 30 7 7 1 0 42 42 42 11 2 0 8 8 8 3 0 55 55 20 4 1 7 7 30 30 5 1 90 90 90 42 6 1 13 13 13 7 1 20 20 55 8 2 71 71 71 71 9 2 11 11 11 90 0 1 11 2 Classificação obtida Posição no “array” 7 8 34 Exemplo de “Shell Sort” (2) Intervalo 2 - Classificar por inserção Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 1 2 2 3 2 4 4 Posição no “array” Posição no novo“array” A inserir Vai para 0 0 1 1 2 2 3 3 4 4 Classificação obtida Posição no “array” 7 0 0 7 7 7 7 7 7 1 0 11 11 11 11 11 11 2 1 8 8 8 8 8 8 3 1 20 20 20 20 20 20 4 2 30 30 30 30 13 13 5 2 42 42 42 42 42 42 6 3 13 13 13 13 30 30 7 3 55 55 55 55 55 55 8 4 71 71 71 71 71 71 9 4 90 90 90 90 90 90 0 1 11 2 3 20 4 13 8 5 42 6 30 7 55 8 71 9 90 35 Exemplo de “Shell Sort” (3) Intervalo 1 - Classificar por inserção Posição no “array” A inserir Vai para 0 0 1 1 2 1 3 3 4 3 5 5 6 5 7 7 8 8 9 9 - 0 7 7 7 7 7 7 7 7 7 7 7 7 1 11 11 11 11 8 8 8 8 8 8 8 8 2 8 8 8 8 11 11 11 11 11 11 11 11 3 20 20 20 20 20 20 13 13 13 13 13 13 4 13 13 13 13 13 13 20 20 20 20 20 20 5 42 42 42 42 42 42 42 42 30 30 30 30 6 30 30 30 30 30 30 30 30 42 42 42 42 7 55 55 55 55 55 55 55 55 55 55 55 55 8 71 71 71 71 71 71 71 71 71 71 71 71 9 90 90 90 90 90 90 90 90 90 90 90 90 2 11 3 13 4 20 5 30 6 42 7 55 8 71 9 90 Classificação obtida Posição no “array” 0 7 1 8 36 Critérios de Opção Sugestão Método de Classificação “quick sort” “heap sort” “shell sort” Número mínimo recomendável de registros 30 70 400 Uma regra simples, que deve ser reavaliada em casos mais sensíveis, consiste em se utilizar: Inserção simples para “arrays” com até 30 registros; “Quick Sort” para “arrays” com mais de 30 registros. 37 Hierarquia de classes para a classificação interna 38 Interface Sorter // pgm15_01.java public interface Sorter { void sort (Comparable[]array); } 39 A Classe Abstrata AbstractSorter (1) // pgm15_02.java public abstract class AbstractSorter implements Sorter { protected Comparable[] array; protected int n; protected abstract void sort(); 40 A Classe Abstrata AbstractSorter (2) public final void sort (Comparable[] array) { n = array.length; this.array = array; if(n > 0) sort(); this.array = null; } protected final { Comparable array[i] = array[j] = } void swap(int i, int j) tmp = array[i]; array[j]; tmp; } 41 Insertion Sorting 42 A Classe StraightInsertionSorter // pgm15_03.java public class StraightInsertionSorter extends AbstractSorter { protected void sort() { for(int i = 1; i < n; ++i) for(int j = i; j > 0 && array[j - 1].isGT (array [j]); --j) { swap(j, j - 1); } } } 43 A Classe BinaryInsertionSorter (1) // pgm15_04.java public class BinaryInsertionSorter extends AbstractSorter { protected void sort() { for(int i = 1; i < n; ++i) { Comparable tmp = array[i]; int left = 0; int right = i; 44 A Classe BinaryInsertionSorter (2) while(left < right) { int middle = (left + right) / 2; if(tmp.isGE(array[middle])) left = middle + 1; else right = middle; } for(int j = i; j > left; --j) swap (j - 1, j); } } } 45 Bublesort 46 A Classe BubbleSorter // pgm15_05.java public class BubbleSorter extends AbstractSorter { protected void sort() { for(int i = n; i > 1; --i) for(int j = 0; j < i - 1; ++j) if(array[j].isGT(array[j + 1])) swap(j, j + 1); } } 47 QuickSort 48 A Classe Abstrata AbstractQuickSorter (1) // pgm15_06.java public abstract class AbstractQuickSorter extends AbstractSorter { protected static final int cutOff = 2; // minimum cut-off protected abstract int selectPivot(int left, int right); // ... } 49 A Classe Abstrata AbstractQuickSorter (2) // pgm15_07.java public abstract class AbstractQuickSorter extends AbstractSorter { protected void sort(int left, int right) { if(right - left + 1 > cutOff) { int p = selectPivot(left, right); swap(p, right); Comparable pivot = array[right]; int i = left; int j = right - 1; 50 A Classe Abstrata AbstractQuickSorter (3) for(;;) { while(i < j && array[i].isLT(pivot)) while(i < j && array[j].isGT(pivot)) if(i >= j) break; ++i; --j; swap(i++, j--); } if(array[i].isGT(pivot)) swap(i, right); if(left < i) sort(left, i - 1); if(right > i) sort(i + 1, right); } } // ... } 51 A Classe Abstrata AbstractQuickSorter (4) // pgm15_08.java public abstract class AbstractQuickSorter extends AbstractSorter { protected void sort() { sort(0, n - 1); Sorter sorter = new StraightInsertionSorter(); sorter.sort(array); } // ... } 52 A Classe MedianOfThreeQuickSorter // pgm15_09.java public class MedianOfThreeQuickSorter extends AbstractQuickSorter { protected int selectPivot(int left, int right) { int middle = (left + right) / 2; if (array[left].isGT(array[middle])) swap(left, middle); if(array[left].isGT(array[right])) swap(left, right); if(array[middle].isGT(array[right])) swap(middle, right); return middle; } } 53 StraightSelectionSort 54 A Classe StraightSelectionSorter // pgm15_10.java public class StraightSelectionSorter extends AbstractSorter { protected void sort() { for(int i = n; i > 1; --i) { int max = 0; for(int j = 1; j < i; ++j) if(array[j].isGT(array[max])) max = j; swap(i - 1, max); } } } 55 HeapSort 56 Construção de um Heap 57 Heap Sorting 58 A classe HeapSorter (1) // pgm15_11.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void percolateDown(int i, int length) { while(2 * i <= length) { int j = 2 * i; if( j < length && array[j + 1 - base].isGT(array[j - base]) ) 59 A classe HeapSorter (2) j = j + 1; if(array[i - base].isGE(array[j - base])) break; swap(i - base, j - base); i = j; } } // ... } 60 A classe HeapSorter (3) // pgm15_12.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void buildHeap() { for(int i = n / 2; i > 0; --i) percolateDown (i, n); } // ... } 61 A classe HeapSorter (4) // pgm15_13.java public class HeapSorter extends AbstractSorter { protected static final int base = 1; protected void sort() { buildHeap(); for(int i = n; i >= 2; --i) { swap(i - base, 1 - base); percolateDown(1, i - 1); } } // ... } 62 Two Way Merging 63 Two Way Merge Sorting 64 A classe TwoWayMergeSorter (1) // pgm15_14.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; // ... } 65 A classe TwoWayMergeSorter (2) // pgm15_15.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; protected void merge(int left, int middle, int right) { int i = left; int j = left; int k = middle + 1; 66 A classe TwoWayMergeSorter (3) while(j <= middle && k <= right) { if(array[j].isLT(array[k])) tempArray[i++] = array[j++]; else tempArray[i++] = array[k++]; } while(j <= middle) tempArray[i++] = array[j++]; for(i = left; i < k; ++i) array[i] = tempArray[i]; } // ... } 67 A classe TwoWayMergeSorter (4) // pgm15_16.java public class TwoWayMergeSorter extends AbstractSorter { Comparable[] tempArray; protected void { tempArray sort(0, n tempArray } sort() = new Comparable[n]; - 1); = null; 68 A classe TwoWayMergeSorter (5) protected void sort (int left, int right) { if(left < right) { int middle = (left + right) / 2; sort(left, middle); sort(middle + 1, right); merge(left, middle, right); } } // ... } 69 Bucket Sorting 70 A classe BucketSorter (1) // pgm15_17.java public class BucketSorter extends AbstractSorter { protected int m; protected int[] count; public BucketSorter(int m) { this.m = m; count = new int [m]; } protected void sort() { sort((Int[]) array); } // ... } 71 A classe BucketSorter (2) // pgm15_18.java public class BucketSorter extends AbstractSorter { protected int m; protected int[] count; protected void sort(Int[] array) { for(int i = 0; i < m; ++i) count[i] = 0; for(int j = 0; j < n; ++j) ++count[array[j].intValue()]; for(int i = 0, j = 0; i < m; ++i) for( ; count[i] > 0; --count[i]) array[j++] = new Int(i); } // ... } 72 Radix Sorting 73 A classe RadixSorter (1) // pgm15_19.java public class RadixSorter extends AbstractSorter { protected static final int r = 8; // bits da raiz protected static final int R = 1 << r; // Raiz protected static final int p = (32 + r - 1) / r; // Int com 32 bits // p número de passagens para varrer um Int protected int[] count = new int [R]; protected void sort() { sort ((Int[]) array); } // ... } 74 A classe RadixSorter (2) // pgm15_20.java public class RadixSorter extends AbstractSorter { protected void sort (Int[] array) { Int[] tempArray = new Int[n]; 75 A classe RadixSorter (3) for(int i = 0; i < p; ++i) { for(int j = 0; j < R; ++j) count[j] = 0; for(int k = 0; k < n; ++k) { // r * i é o número de dígitos argumento do right shift // R – 1 é a máscara para R = 10000, R - 1 = 1111 ++count[( array[k].intValue() >>> (r*i) ) & (R-1)]; tempArray[k] = array[k]; } int pos = 0; for(int j = 0; j < R; ++j) { int tmp = pos; pos += count[j]; count[j] = tmp; } 76 A classe RadixSorter (4) for(int k = 0; k < n; ++k) { int j = ( tempArray[k].intValue() >>> (r*i) ) & (R-1); array[count[j]++] = tempArray[k]; } } } // ... } 77