Software  
 
Rede de conhecimento computador >> Software >> Software de processamento de texto >> Content
Quais são alguns exemplos de pseudocódigo para classificar algoritmos e como eles diferem em termos de implementação de eficiência?
Ok, vamos explorar alguns algoritmos de classificação comuns com pseudocódigo e discutir suas diferenças em eficiência e implementação.

Nota importante: O Pseudocode deve ser uma representação de alto nível, não diretamente executável. Ele se concentra na * lógica * do algoritmo. A implementação real do código variará com base na linguagem de programação e nos requisitos específicos.

1. Bubble Sort

* Conceito: Passos repetidamente na lista, compara elementos adjacentes e os troca se estiverem na ordem errada. Elementos mais pesados ​​"bolhas" até o fim.

* pseudocode:

`` `
Procedimento Bubblesort (Lista:Matriz de itens)

n =comprimento (lista)

para i =0 a n-1 fazer
para j =0 a n-i-1 fazer
Se lista [j]> Lista [j+1] então
Lista de troca [j] e lista [j+1]
final se
final para
final para

Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n) (quando a lista já está classificada. Uma versão otimizada pode detectar isso.)
* Caso médio: O (n 2 )
* Pior caso: O (n 2 )
* Complexidade do espaço: O (1) (classificação no local)

* Implementação: Muito simples de implementar.

* Use casos: Principalmente educacional. Não é adequado para grandes conjuntos de dados devido ao mau desempenho. Pode ser útil para listas pequenas, quase classificadas, se otimizadas.

2. Classificação de seleção

* Conceito: Encontra o elemento mínimo na parte não classificada da lista e a troca com o elemento no início da porção não classificada.

* pseudocode:

`` `
Procedimento Selectionsort (Lista:Matriz de itens)

n =comprimento (lista)

para i =0 a n-1 fazer
// encontra o índice do elemento mínimo na parte não classificada
min_index =i
para j =i+1 a n-1 fazer
Se lista [j] min_index =j
final se
final para

// Troque o elemento mínimo encontrado com o primeiro elemento
Lista de troca [i] e listar [min_index]
final para

Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n 2 )
* Caso médio: O (n 2 )
* Pior caso: O (n 2 )
* Complexidade do espaço: O (1) (classificação no local)

* Implementação: Relativamente simples.

* Use casos: O desempenho é um pouco melhor do que a classificação de bolhas em alguns casos, mas ainda não é adequado para conjuntos de dados grandes. O número de swaps é limitado a O (n), que pode ser útil se as gravações da memória forem caras.

3. Classificação de inserção

* Conceito: Construa a lista classificada um elemento de cada vez. Ele itera através dos dados de entrada, remove um elemento de cada vez, encontra a posição correta na lista classificada e o insere lá.

* pseudocode:

`` `
Inserções do procedimento (Lista:Matriz de itens)

n =comprimento (lista)

para i =1 a n-1 fazer
key =list [i]
j =i - 1

// mova elementos da lista [0..i-1], que são maiores que a chave,
// para uma posição antes de sua posição atual
enquanto j> =0 e listar [j]> chave
Lista [J+1] =Lista [J]
j =j - 1
termine enquanto
Lista [j+1] =chave
final para

Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n) (quando a lista já está classificada)
* Caso médio: O (n 2 )
* Pior caso: O (n 2 )
* Complexidade do espaço: O (1) (classificação no local)

* Implementação: Simples e eficiente para pequenos conjuntos de dados ou dados quase classificados.

* Use casos: Bom para pequenas listas ou quando você espera que os dados de entrada sejam classificados principalmente. Além disso, é um algoritmo * on -line *, o que significa que pode classificar uma lista à medida que recebe.

4. Mesclar classificar

* Conceito: Um algoritmo de divisão e conquista. Ele divide a lista em sublistas menores, classifica recursivamente os sublistas e depois os mescla novamente.

* pseudocode:

`` `
Procedimento Murgesort (Lista:Matriz de itens)

n =comprimento (lista)

Se n <=1 então
Lista de retorno // já classificado
final se

// dividiu a lista em duas metades
MID =N / 2
Lista de esquerda =lista [0 a meados de 1]
RightList =List [MID para N-1]

// classificar recursivamente cada metade
Lista de esquerda =Mergesort (Lista de esquerda)
RightList =Mergesort (Lista direita)

// mesclar as metades classificadas
Merge de retorno (Lista de esquerda, lista direita)

Procedimento final

Mesclação do procedimento (Lista de esquerda:Matriz de itens, Lista direita:Matriz de itens)

resultList =nova matriz

enquanto a lista de esquerda não está vazia e a lista direita não está vazia
Se lista de esquerda [0] <=RightList [0] então
Anexe a Lista de esquerda [0] à lista de resulta
Remova a lista de esquerda [0] da lista de esquerda
outro
Anexar a Lista Right [0] à Lista de Resultado
Remova a lista direita [0] da lista direita
final se
termine enquanto

// Anexe os elementos restantes da lista de esquerda ou da lista direita
Anexe todos os elementos restantes da lista de esquerda à lista de resulta
Anexe todos os elementos restantes da lista direita à lista de resultados

Retornar ResultList

Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n log n)
* Caso médio: O (n log n)
* Pior caso: O (n log n)
* Complexidade do espaço: O (n) (requer espaço extra para fusão)

* Implementação: Mais complexo que os algoritmos anteriores, mas fornece um bom desempenho para conjuntos de dados grandes.

* Use casos: Adequado para classificar grandes listas onde o desempenho consistente é importante.

5. Classificação rápida

* Conceito: Também um algoritmo de divisão e conquista. Ele escolhe um elemento como um pivô e particiona a matriz dada em torno do pivô escolhido.

* pseudocode:

`` `
Procedimento Quicksort (Lista:Matriz de itens, Baixo:Int, High:Int)

se baixo // Índice de particionamento, arr [p] está agora no lugar certo
p =partição (lista, baixa, alta)

// classificar elementos separadamente antes da partição e após a partição
Quicksort (Lista, Low, P-1)
Quicksort (lista, p+1, alta)
final se

Procedimento final

Partição do procedimento (Lista:Matriz de itens, Baixo:Int, Alta:Int)

pivô =lista [alta] // Escolha o último elemento como o pivô
i =baixo - 1 // índice de elemento menor

para J =baixo a alto-1 fazer
// se o elemento atual for menor ou igual a pivô
se list [j] <=pivot então
i =i + 1 // Índice de incremento de elemento menor
Lista de troca [i] e listar [J]
final se
final para

Lista de troca [i + 1] e listar [High]
retornar i + 1
Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n log n) (quando o pivô é sempre a mediana)
* Caso médio: O (n log n)
* Pior caso: O (n 2 ) (Quando o pivô é sempre o menor ou o maior elemento)
* Complexidade do espaço: O (log n) (devido a chamadas recursivas, pode ser O (n) na pior das hipóteses)

* Implementação: Geralmente rapidamente na prática, mas seu pior desempenho pode ser uma preocupação. A escolha do pivô afeta significativamente seu desempenho.

* Use casos: Freqüentemente, o algoritmo de classificação mais rápido na prática para grandes conjuntos de dados. No entanto, seu pior desempenho deve ser considerado. Muitas implementações usam randomização ou outras técnicas para evitar o pior caso.

6. Classificação de heap

* Conceito: Construa uma pilha máxima (ou Min Heap) a partir dos dados de entrada e, em seguida, extrai repetidamente o elemento raiz (o maior ou o menor elemento) e o coloca no final da matriz classificada.

* pseudocode:

`` `
Procedimento Heapsort (Lista:Matriz de itens)

n =comprimento (lista)

// Construa heap max
para i =n/2 - 1 até 0
heapify (lista, n, i)
final para

// um por um extraia um elemento de heap
para i =n-1 para 0
Lista de troca [0] e listar [i] // mover a raiz atual para terminar

// Ligue para Max Heapify na pilha reduzida
heapify (lista, i, 0)
final para
Procedimento final

Procedimento Heapify (Lista:Matriz de itens, n:int, i:int)

maior =i // inicialize o maior como raiz
Esquerda =2*i + 1
direita =2*i + 2

// Se o filho esquerdo for maior que a raiz
se deixado list [maior] então
Maior =esquerda
final se

// Se a criança certa for maior que a maior até agora
Se correto list [maior] então
Maior =certo
final se

// se o maior não for raiz
Se maior! =Eu então
Lista de troca [i] e listar [maior]

// errar recursivamente a sub-árvore afetada
heapify (lista, n, maior)
final se
Procedimento final
`` `

* Eficiência:

* Melhor caso: O (n log n)
* Caso médio: O (n log n)
* Pior caso: O (n log n)
* Complexidade do espaço: O (1) (classificação no local)

* Implementação: Mais complexo que os algoritmos mais simples, mas garante o desempenho do O (n log n).

* Use casos: Uma boa escolha quando você precisa de desempenho garantido O (n log n) e a classificação no local é desejável. Usado em implementações de fila prioritária.

Tabela de eficiências resumidas

| Algoritmo | Melhor caso | Caso médio | Pior caso | Complexidade espacial |
| --------------------- | ----------- | ------------ | ------------ | ------------------- |
| Bolhas de bolha | O (n) | O (n 2 ) | O (n 2 ) | O (1) |
| Classificação de seleção | O (n 2 ) | O (n 2 ) | O (n 2 ) | O (1) |
| Classificação de inserção | O (n) | O (n 2 ) | O (n 2 ) | O (1) |
| Merge classy | O (n log n) | O (n log n) | O (n log n) | O (n) |
| Classificação rápida | O (n log n) | O (n log n) | O (n 2 ) | O (log n) |
| Classificação da pilha | O (n log n) | O (n log n) | O (n log n) | O (1) |

Diferenças -chave em eficiência e implementação:

* quadrático vs. logarítmico: Algoritmos com O (n 2 ) A eficiência (bolha, seleção, inserção) é adequada apenas para pequenos conjuntos de dados. Os algoritmos com a eficiência do O (n log n) (mesclagem, rápida, heap) são muito mais eficientes para conjuntos de dados maiores.
* Divida e conquista: Merge Classificação e classificação rápida Use a estratégia de dividir e conquista, que permite uma classificação mais eficiente de grandes conjuntos de dados.
* classificação no local: Classificação de bolhas, classificação de seleção, classificação de inserção e classificação de heap são algoritmos de classificação no local, o que significa que eles não exigem memória extra significativa. A classificação de mesclagem requer espaço extra O (n) para fusão. A classificação rápida requer O (log n), em média, mas o espaço O (n) no pior caso devido às chamadas recursivas.
* Estabilidade: Um algoritmo de classificação é * estável * se elementos com valores iguais mantiveram sua ordem relativa após a classificação. A classificação de mesclagem e a classificação de inserção são estáveis, enquanto a classificação da pilha e a classificação rápida (em sua forma básica) não são. A estabilidade pode ser importante em determinadas aplicações.
* Choice Pivot (Classificação rápida): O desempenho da classificação rápida depende fortemente da escolha do elemento pivô. As más opções de pivô podem levar ao pior caso O (n 2 ) desempenho.
* Complexidade da implementação: A classificação e a espécie de inserção de bolhas são os mais simples de implementar. Merge classificar, classificar rápido e classificar Heap são mais complexos.
* Adaptividade: O tipo de inserção é adaptável, o que significa que seu desempenho melhora se os dados de entrada já estiverem parcialmente classificados.

Escolhendo o algoritmo certo:

O melhor algoritmo de classificação a ser usado depende do aplicativo específico e das características dos dados. Considere estes fatores:

* Tamanho do conjunto de dados: Para conjuntos de dados muito pequenos, a simplicidade do tipo de bolha ou tipo de inserção pode ser suficiente. Para conjuntos de dados maiores, classificação de mesclagem, classificação rápida ou classificação de heap, geralmente são melhores opções.
* Nível de classificação: Se os dados já estiverem classificados, a classificação da inserção pode ser a opção mais rápida.
* restrições de memória: Se a memória for limitada, os algoritmos de classificação no local, como classificação de bolhas, classificação de seleção, classificação de inserção e classificação de heap.
* Requisitos de estabilidade : Se for necessária estabilidade, escolha um algoritmo de classificação estável, como classificação de mesclagem ou tipo de inserção.
* Pior desempenho: Se você precisar de desempenho garantido, evite uma classificação rápida (a menos que seja implementado com randomização do pivô ou outras estratégias para mitigar o pior comportamento).
* Facilidade de implementação e manutenção: Considere o trade-off entre desempenho e complexidade da implementação.

Espero que essa explicação detalhada ajude! Deixe -me saber se você tiver mais alguma dúvida.

Anterior :

Próximo :
  Os artigos relacionados
·Descrição do Windows Processador de Texto 
·Como inserir uma página no WordPad 
·Como adicionar um gráfico Border para documentos do Wo…
·Como você destaca uma palavra específica no arquivo d…
·Como editar Word 2007 Estilos Rápidos 
·Como fazer uma riscadas no OpenOffice 
·Como criar uma brochura com três dobras Com o Word 
·Como se livrar da caixa de ferramentas no Word 
·Teorias sobre Webdings 
·Como adicionar uma página em branco para um documento …
  Artigos em destaque
·Como fazer o próximo slide aleatório no PowerPoint 
·Quais os acessórios que eu preciso para Skype 
·Como converter arquivos do Excel para PDF sem usar o Ex…
·Estilos de Fontes assustadores 
·Como um oráculo recebeu esse nome? 
·Como desativar o Bloom em Bad Company 2 
·Como criar um site em Dreamweaver 8 Tutorial 
·Como montar ISO para o Windows 2000 Professional 
·Como gravar um CD a partir de um site 
·WMA para o formato DVD 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados