








































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Uma análise detalhada de algoritmos de ordenação avançados, incluindo merge sort, quick sort e shell sort. são descritos seus funcionamentos, complexidades e comparados com algoritmos mais básicos como bubble sort, insertion sort e selection sort. O texto inclui exemplos de código e ilustrações, facilitando o entendimento dos conceitos. ideal para estudantes de ciência da computação e áreas afins.
Tipologia: Resumos
1 / 48
Esta página não é visível na pré-visualização
Não perca as partes importantes!









































Apresentação dos algoritmos de ordenação avançados (merge sort, quick sort e shell sort) e discussão sobre suas complexidades.
Entender o funcionamento dos algoritmos de ordenação básicos e avançados é essencial para os profissionais de Tecnologia da Informação (TI) escolherem corretamente o algoritmo mais adequado à solução do problema a ser tratado.
Reconhecer os algoritmos de ordenação elementares
Descrever o funcionamento do algoritmo de ordenação por intercalação ( merge sort )
Descrever o funcionamento do algoritmo de ordenação rápida ( quick sort )
Descrever o funcionamento do algoritmo de ordenação shell sort
No mundo da computação, as operações essenciais, e muito analisadas, são a ordenação e a pesquisa por determinado elemento em um conjunto de valores. Essas tarefas são usadas em muitos programas, além de compiladores, interpretadores, banco de dados e sistemas operacionais.
Neste tema, apresentaremos os fundamentos dos principais métodos de ordenação e analisaremos sua complexidade.
Reconhecer os algoritmos de ordenação elementares
Ordenação corresponde ao método de organizar um conjunto de objetos em uma ordem (ascendente ou descendente).
Mais especificamente, há diversos tipos de algoritmos de ordenação, entre os quais podemos destacar:
Métodos
Ordenação por inserção
Ordenação por troca
Ordenação por seleção
Tipos de algoritmos de ordenação.
ORDENAÇÃO POR INSERÇÃO
Inserção direta ( insertion sort );
Incrementos decrescentes.
ORDENAÇÃO POR TROCA
Bolha ( bubble sort );
Troca e partição ( quick sort ).
ORDENAÇÃO POR SELEÇÃO
Seleção direta ( selection sort );
Seleção em árvore ( heap sort ).
A seguir, vamos abordar alguns dos principais algoritmos básicos de ordenação de dados armazenados em arrays (ordenação interna).
Também conhecido como ordenação por “bolhas”, o bubble sort é um dos algoritmos de ordenação mais conhecidos e um dos mais simples.
O algoritmo bubble sort funciona da seguinte forma:
Em cada etapa, cada elemento é comparado com o próximo, e haverá uma troca se o elemento não estiver na ordem correta.
A comparação é novamente realizada até que as trocas não sejam mais necessárias.
Para entendermos melhor como utilizar esse algoritmo, vamos apresentar um exemplo.
I. Primeiro, vamos colocar os elementos representados em um vetor, com Item[1] mais à esquerda e Item[n] mais à direita.
II. Em cada passo, o maior elemento é deslocado para a direita até encontrar um elemento maior ainda, conforme mostra a figura ao lado:
troca = 0 ; while (i < TAMANHO - 1 ) { if (v[i] > v[i+ 1 ]) { aux = v[i]; v[i] = v[i+ 1 ]; v[i+ 1 ] = aux; troca = 1 ; } i++; } i = 0 ; } }
Método da bolha em C.
O esforço computacional despendido pela ordenação de um vetor pode ser determinado pelo número de comparações, que também serve para estimar o número máximo de trocas possíveis de se realizar.
Na primeira passada, fazemos n-1 comparações; na segunda, n-2 ; na terceira, n-3 ; e assim por diante.
Logo, o tempo total gasto pelo algoritmo é proporcional a:
(n-1) + (n-2) + … + 2 + 1.
A soma desses termos é proporcional ao quadrado de n. Portanto, o desempenho computacional desse algoritmo varia de forma quadrática em relação ao tamanho do problema.
Em geral, usamos a notação Big-O para expressar como a complexidade de um algoritmo varia com o tamanho do problema.
Assim, nesse caso, em que o tempo computacional varia de forma quadrática com o tamanho do
problema, trata-se de um algoritmo de ordem quadrática , e expressamos isso escrevendo O(n^2 ).
No melhor caso, quando o vetor fornecido estiver quase ordenado, o procedimento poderá ser capaz de ordenar em uma única passada. No entanto, esse fato não pode ser usado para fazer uma análise de desempenho do algoritmo, pois o melhor caso representa uma situação muito particular.
Também conhecido como ordenação por inserção , o insertion sort é outro algoritmo de ordenação bastante simples.
Ele tem esse nome, pois se assemelha ao processo de ordenação de um conjunto de cartas de baralho com as mãos: pega uma carta de cada vez e a insere em seu devido lugar, sempre deixando as cartas da mão em ordem.
Na prática, esse algoritmo possui um desempenho superior quando comparado com outros algoritmos, como o bubble sort e o selection sort.
Autor: Edgar Gurgel Funcionamento insertion sort.
Médio = 1/4(n^2 – n);
Pior = 1/2(n^2 + n).
Portanto, para o pior caso, a ordenação por inserção é tão ruim quanto a ordenação bolha e a ordenação por seleção, ou seja, sua complexidade é O(n 2 ). Para o caso médio, é somente um pouco
melhor.
No entanto, a ordenação por inserção tem duas vantagens:
Ela se comporta naturalmente, isto é, trabalha menos, quando a matriz já está ordenada, e o máximo, quando a matriz está ordenada no sentido inverso. Isso torna a ordenação excelente para listas que estão quase em ordem.
Ela não rearranja elementos de mesma chave. Isso significa que uma lista que é ordenada por duas chaves permanece ordenada para ambas as chaves após uma ordenação por inserção.
Também conhecido como ordenação por seleção, o selection sort é outro algoritmo de ordenação bastante simples. Ele tem esse nome, pois, a cada passo, seleciona o melhor elemento (maior ou menor, dependendo do tipo de ordenação) para ocupar aquela posição do array.
Na prática, esse algoritmo possui um desempenho quase sempre superior quando comparado com o bubble sort.
Autor: Edgar Gurgel Funcionamento selection sort.
O algoritmo selection sort funciona da seguinte forma:
O algoritmo divide o array em duas partes:
A parte ordenada, à esquerda do elemento analisado.
A parte que ainda não foi ordenada, à direita do elemento.
Para cada elemento do array , começando do primeiro, o algoritmo procura na parte não ordenada (direita) o menor valor (ordenação crescente) e troca os dois valores de lugar.
Em seguida, o algoritmo avança para a próxima posição do array. Esse processo é feito até que todo o array esteja ordenado.
O código que implementa o algoritmo de seleção é o seguinte:
void selecao (int *v) { int i,j,aux, minimo, pos_minimo; for (i= 0 ; i < TAMANHO- 1 ; i++)
A) A verificação da integridade de vetores.
B) O armazenamento de vetores.
C) A ordenação de vetores.
D) A recuperação de vetores.
E) A exclusão de vetores.
A) Insertion sort
B) Selection sort
C) Merge sort
D) Quick sort
E) Bubble sort
1. Algoritmos como bubble sort e selection sort têm como finalidade:
A alternativa "C " está correta.
Os dois algoritmos ( bubble sort e selection sort ) são voltados para a ordenação de estruturas de vetores, de acordo com o critério que foi definido. As duas formas mais comuns são a ordenação lexicográfica e a numérica.
2. O algoritmo a seguir, descrito em pseudocódigo, pode ser utilizado para ordenar um vetor V[1..n] em ordem crescente:
Esse algoritmo é conhecido como:
A alternativa "E " está correta.
O bubble sort realiza múltiplas passagens por uma lista. Ele compara itens adjacentes e troca aqueles que estão fora de ordem. Cada passagem pela lista coloca o próximo maior valor em sua posição correta. Em essência, cada item se desloca como uma “bolha” para a posição à qual pertence. Se existem n itens na lista, então, há 𝑛−1 pares de itens que precisam ser comparados na primeira passagem.
Descrever o funcionamento do algoritmo de ordenação por intercalação ( merge sort )
É ótimo candidato para o emprego da programação paralela – caso exista mais de um processador, certamente, ele terá um bom desempenho.
A execução do algoritmo merge sort pode ser representada com o uso de uma árvore binária da seguinte forma:
Cada nó representa uma chamada recursiva do merge sort.
O nó raiz é a chamada inicial.
Os nós folhas são vetores de 1 ou 2 números, que são os casos base.
Agora, vamos mostrar um exemplo de execução do merge sort para ordenar o seguinte vetor:
O primeiro passo é a partição do problema, sempre no meio do vetor. Dessa forma, o vetor inicial é particionado em duas partes (7 2 9 4 e 3 8 6 1), conforme mostra a figura a seguir:
Em seguida, vamos fazer uma chamada recursiva para a primeira partição do vetor 7 2 9 4, que será particionada em duas partes (7 2 e 9 4):
Uma nova chamada recursiva é feita para essa primeira partição 7 2, de tal forma que vamos particioná- la em duas partes (7 e 2) por meio de uma chamada recursiva, conforme mostra a figura a seguir:
Em seguida, faremos duas chamadas recursivas para o caso base encontrado (7 e 2).
A primeira chamada recursiva é representada na figura a seguir:
A segunda chamada recursiva para o caso base (7 e 2) é representada na figura a seguir:
Em seguida, vamos executar os mesmos procedimentos para ordenar a segunda partição do vetor, que ficará da seguinte forma, conforme mostra a figura a seguir:
Por fim, o último merge servirá para ordenar as duas partições do vetor. Dessa forma, teremos as duas partições (2 4 7 9 e 1 3 6 8) ordenadas, conforme mostra a figura a seguir:
O algoritmo merge sort será implementado pelo programa a seguir e por suas funções. Primeiro, vamos apresentar o programa principal:
#include <stdio.h> #include <stdlib.h> // funções void mergesort(int *v, int n); void sort(int *v, int *c, int i, int f); void merge(int *v, int *c, int i, int m, int f); // programa principal int main (void) { int i; int v[ 8 ] = { - 1 , 7 , - 3 , 11 , 4 , - 2 , 4 , 8 }; mergesort(v, 8 ); for (i = 0 ; i < 8 ; i++) printf("%d ", v[i]); putchar('\n'); return 0 ; }
Agora, vamos apresentar suas funções.
Dado um vetor de inteiros v e um inteiro n >= 0, ordena o vetor v[0..n-1] em ordem crescente:
void mergesort(int *v, int n) { int *c = malloc(sizeof(int) * n); sort(v, c, 0 , n - 1 ); free(c); }
Dado um vetor de inteiros v e dois inteiros i e f, ordena o vetor v[i..f] em ordem crescente. O vetor c é utilizado internamente durante a ordenação:
void sort(int *v, int c, int i, int f) { if (i >= f) return; int m = (i + f) / 2 ; sort(v, c, i, m); sort(v, c, m + 1 , f); / Se v[m] <= v[m + 1], então v[i..f] já está ordenado. */ if (v[m] <= v[m + 1 ]) return; merge(v, c, i, m, f); }
Dado um vetor v e três inteiros i, m e f, sendo v[i..m] e v[m+1..f] vetores ordenados, coloca os elementos desses vetores, em ordem crescente, no vetor em v[i..f]: