Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Algoritmos de Ordenação: Merge Sort, Quick Sort e Shell Sort, Resumos de Autômatos e Teoria da Complexidade

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

2025

Compartilhado em 29/04/2025

eliza-leal-suzano
eliza-leal-suzano 🇧🇷

5 documentos

1 / 48

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
DESCRIÇÃO
Apresentação dos algoritmos de ordenação avançados (merge sort, quick sort e shell sort) e discussão
sobre suas complexidades.
PROPÓSITO
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.
OBJETIVOS
MÓDULO 1
Reconhecer os algoritmos de ordenação elementares
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30

Pré-visualização parcial do texto

Baixe Algoritmos de Ordenação: Merge Sort, Quick Sort e Shell Sort e outras Resumos em PDF para Autômatos e Teoria da Complexidade, somente na Docsity!

DESCRIÇÃO

Apresentação dos algoritmos de ordenação avançados (merge sort, quick sort e shell sort) e discussão sobre suas complexidades.

PROPÓSITO

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.

OBJETIVOS

MÓDULO 1

Reconhecer os algoritmos de ordenação elementares

MÓDULO 2

Descrever o funcionamento do algoritmo de ordenação por intercalação ( merge sort )

MÓDULO 3

Descrever o funcionamento do algoritmo de ordenação rápida ( quick sort )

MÓDULO 4

Descrever o funcionamento do algoritmo de ordenação shell sort

INTRODUÇÃO

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.

MÓDULO 1

Reconhecer os algoritmos de ordenação elementares

PROCESSO DE ORDENAÇÃO

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).

BUBBLE SORT

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:

ETAPA 01

Em cada etapa, cada elemento é comparado com o próximo, e haverá uma troca se o elemento não estiver na ordem correta.

ETAPA 02

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.

 COMENTÁRIO

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 ).

 ATENÇÃO

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.

INSERTION SORT (INSERÇÃO)

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.

 COMENTÁRIO

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:

PRIMEIRA VANTAGEM

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.

SEGUNDA VANTAGEM

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.

SELECTION SORT (SELEÇÃ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.

 COMENTÁRIO

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:

  1. Selecione o elemento com a chave de menor valor.
  2. Troque-o com o primeiro elemento da sequência.
  3. Repita essas operações com os n-1 elementos restantes; depois, com os n-2 elementos; e assim sucessivamente, até restar um só elemento (o maior deles), conforme mostra a figura a seguir:

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++)

VERIFICANDO O APRENDIZADO

1. ALGORITMOS COMO BUBBLE SORT E SELECTION SORT TÊM COMO

FINALIDADE:

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.

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) Insertion sort

B) Selection sort

C) Merge sort

D) Quick sort

E) Bubble sort

GABARITO

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.

MÓDULO 2

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.

EXECUÇÃO

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:

IMPLEMENTAÇÃO

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]: