Processo de rearranjar um conjunto de elementos de forma ascendente ou

0
0
61
6 months ago
Preview
Full text

  

Professor: Isac Mendes Lacerda, M.Sc., PMP, CSM

e-mail: isac.curso@gmail.com

  

Universidade Federal do Rio de Janeiro (UFRJ)

Material 3

  • – Ordenação

   Processo de rearranjar um conjunto de elementos de forma ascendente ou descendente

  

Tem-se bons exemplos de como resolver

problemas através de computador

   Serve para facilitar a recuperação posterior de itens do conjunto ordenado

   Relaciona-se com problemas do dia a dia

   Bubble Sort: ordenação por bolha

   Insertion Sort: ordenação por inserção

   Selection Sort: ordenação por seleção  Quick Sort: ordenação rápida

   Heap Sort: ordenação cabeça

   Bubble Sort: ordenação por bolha

   Insertion Sort: ordenação por inserção

   Selection Sort: ordenação por seleção  Quick Sort: ordenação rápida

   Heap Sort: ordenação cabeça

   Conhecido como o método da bolha

   Um dos algoritmos mais simples

   Algoritmo:

  

1. Percorra o vetor (ex. lista em python) todo,

comparando elementos adjacentes (2 a 2)

  

2. Troque as posições se eles estiverem fora de

ordem

  

3. Repita os dois primeiros passos até obter a ordenação vamos percorrer a lista 5 

Algoritmo Bubble 1:

  vezes (número de elementos), fazendo as comparações aos pares. Serão feitas 4 comparações por corrida. A ordenação deve ser ascendente.

  1 5 0 8 3

  • – Não troca

  5 Aux

   Algoritmo Bubble 1: vamos percorrer a lista 5 vezes (nº de elementos), fazendo as comparações aos pares. Serão feitas 4 comparações por corrida.

  1

  5

  8

  3

  1 > 5 F

  1

  5

  8

  3

  5 > 0

  mesmo sem precisar!

  5 Aux

V – Troca

  5 > 8 F

  • – Não troca

  1

  5

  8

  3

  8

  5

  8

  3

  3

  3

  3

  8 Isso será executado 5 vezes,

  1

  3

   Faça um programa, onde o usuário deve informar o número de elementos de uma lista e os valores desses elementos (inteiros). Com isso, o programa deve ser capaz de fazer ordenação de forma ascendente, com base no Bubble Sort. Ao final, mostre a lista ordenada e o número de trocas efetuadas.

   vamos percorrer a lista 5 vezes (nº hipotético de

  Algoritmo Bubble 1: elementos), fazendo as comparações aos pares. Serão feitas 4 comparações ( 5

  • – 1 elementos) por corrida.

  Análise de complexidade do algoritmo: 5 (5

  • – 1) = n (n – 1) = n^2 – n

    =

O(n^2)

  = Ordem Quadrática

   No Bubble Sort 1:

  1. Percorremos o vetor (ex. lista em python) todo comparando elementos adjacentes (2 a 2)

  2. Trocamos as posições quando estavam fora de ordem

  3. Repetimos os dois primeiros passos, em um nº de corridas igual ao nº de elementos do vetor

   No Bubble Sort 2 (melhor):

  1. Percorrer o vetor (ex. lista em python), comparando elementos adjacentes (2 a 2)

  2. Trocar as posições quando estiverem fora de ordem

  3. Se houver troca, repetir os dois primeiros passos , com os primeiros n-1 itens, depois com os n-2 itens, até que reste apenas um item

  • – Não troca

  5 Aux

   Algoritmo Bubble 2 (melhor): percorrer a lista pelo menos uma vez.

  Depois repetir apenas se houve troca. Além disso, as comparações devem ser feitas decrementando sempre um elemento da direita.

  1

  5

  8

  3

  1 > 5 F

  1

  5

  8

  3

  5 > 0

  houve troca!

  5 Aux

V – Troca

  3

  5 > 8 F

  • – Não troca

  1

  5

  8

  3

  5

  8

  3

  3

  3

  3

  8 Repetir apenas se

  1

  8

   Altere o primeiro programa, de modo que a lista depois de ter sido percorrido a primeira vez, seja percorrida somente se houve troca na corrida anterior.

  Além disso, a cada corrida, para efeito de comparações, você deve decrementar (desconsiderar) um elemento da direita.

   vamos percorrer a lista no mínimo uma vez e no

  Algoritmo Bubble 2: máximo 4 vezes (5

  • – 1 elemento), fazendo as comparações aos pares. Serão feitas n - 1 comparações na 1ª iteração, n-2 na 2ª ... até 1 comparação.

  Análise de complexidade do algoritmo: Melhor caso: 1 (5

  • – 1) = 1 (n – 1) = n – 1 =

O(n)

  = Ordem linear

   vamos percorrer a lista no mínimo uma vez e no

  Algoritmo Bubble 2: máximo 4 vezes (5

  • – 1 elemento), fazendo as comparações aos pares. Serão feitas n - 1 comparações na 1ª iteração, n-2 na 2ª ... até 1 comparação.

  Análise de complexidade do algoritmo: Pior caso: (5-1)+(5-2)+(5-3)+(5-4)) =

  (n-1)+(n-2)+....+2+1)) = n(n-1+1)/2

O(n^2)

  = Ordem quadrática

   Bubble Sort: ordenação por bolha

   Selection Sort: ordenação por seleção

   Insertion Sort: ordenação por inserção  Quick Sort: ordenação rápida

   Heap Sort: ordenação cabeça

  1

   Conhecido como ordenação por seleção

   Também é um algoritmo simples

   Algoritmo:

  1. Selecione o menor elemento do vetor

  2. Troque-o com o item da 1ª posição do vetor

  

3. Repita os dois primeiros passos com os n-1

elementos, n-2, n-3 até restar 1 elemento (desconsiderando os elementos ordenados da esquerda)

Ilustração do método: Antes 1ª iteração: O R D E N A

  A O

  • – i = 0 Houve Troca R D E N

Ilustração do método: Antes 2ª iteração: A R D E N O

  A O

  • – i = 0 Houve Troca R D E N
  • – i = 1 Houve Troca A D R E N O

Ilustração do método: Antes 3ª iteração: A D R E N O

  A

O

  • – i = 0 Houve Troca R D E N
  • – i = 1 Houve Troca A D R E N O – i = 2 Houve Troca A D

  N O E R

Ilustração do método: Antes 4ª iteração: A D E R N O

  i = 0

A

  • Houve Troca

  R D E N O i = 1

  • Houve Troca A D R E N O

  i = 2

  N O i = 3

E R

  • Houve Troca A D
  • Houve Troca A D E N R O

Ilustração do método: Antes 5ª iteração: A D E N R O

  i = 0

A

  • Houve Troca

  R D E N O i = 1

  • Houve Troca A D R E N O

  i = 2

  N O i = 3

E R

  • Houve Troca A D
  • Houve Troca A D E N R O

  i = 4

  • Houve Troca A D E N O R

   Implemente um programa, em python, que seja capaz de empregar o método

  Selection Sort na ordenação da palavra “ORDENA”.

   Bubble Sort: ordenação por bolha

   Selection Sort: ordenação por seleção

   Insertion Sort: ordenação por inserção  Quick Sort: ordenação rápida

   Heap Sort: ordenação cabeça

  2

  

Conhecido como ordenação por inserção

   Algoritmo:

  faça:  Selecione o i-ésimo item do vetor

  Coloque-o no lugar apropriado na sequência, de  acordo com o critério de ordenação

Ilustração do método: Chaves iniciais: O R D E N A

  i = 1

  D E N A i = 2 D O R E N A i = 3

O R

  

D E O R

N A i = 4 D E N O R A i = 5 A D E N O R

   Implemente um programa, em python, que seja capaz de empregar o método

  Insertion Sort na ordenação da palavra “ORDENA”.

   Bubble Sort: ordenação por bolha

   Selection Sort: ordenação por seleção

   Insertion Sort: ordenação por inserção  Quick Sort: ordenação rápida

   Heap Sort: ordenação cabeça

  2

   Conhecido como ordenação rápida

  Publicado por Hoare em 1962; ◦

  

O mais rápido que se conhece para

◦ ordenação interna; Provavelmente o mais utilizado;

  ◦

Divide o problema, resolve separadamente

  ◦ e consolida em uma única solução.

   Conhecido como ordenação rápida

   Algoritmo de Partição (parte 1):

  1. Escolha arbitrariamente um pivô;

  

2. Percorra o vetor a partir da esquerda até que

L[i]>= pivô;

  

3. Percorra o vetor a partir da direita até que L[j]<=

pivô;

  4. Troque L[i] com L[j]; 5. Continue até que os índices i e j se cruzem.

   Conhecido como ordenação rápida

   Algoritmo recursivo (parte 2):

  

1. Sempre que os índices se cruzarem o processo

deve ser reiniciado para cada um dos pedaços distintos: L[início] até L[j] e L[i] até L[fim];

  

2. Quando em um pedaço houver apenas um

elemento, esse elemento está ordenado.

  2

  8

  6

  10

  4

  7

  3 Pivô = len(L) // 2

  i j

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  L[i] >= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  L[i] >= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  L[i] >= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  L[j] <= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  L[j] <= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j

  “i” e “j” Parados!

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j Troca feita, “i” e “j” avançam.

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j L[i] >= Pivô ?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j “i” parado!

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j L[j] <= Pivô?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j L[j] <= Pivô?

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  i j “i” e “j” Parados!

  2

  8

  6

  10

  4

  7

  3 Pivô = 4

  j i Troca feita, “i” e “j” avançam.

  2

  8

  6

  10

  4

  7

  3

  i j

  “i” e “j” se cruzaram. O vetor é particionado e o processo

  2

  8

  6

  10

  4

  7

  3

  i j

  L[i] >= Pivô? Pivô = 8

  2

  8

  6

  10

  4

  7

  3

  i j

  Pivô = 8 “i” parado!

  2

  8

  6

  10

  4

  7

  3

  i j

  Pivô = 8 L[j] <= Pivô?

  2

  8

  6

  10

  4

  7

  3

  i j

  Pivô = 8 “i” e “j” Parados!

  2

  8

  6

  10

  4

  7

  3

  i j Pivô = 8 Troca feita, “i” e “j” avançam.

  2

  8

  6

  10

  4

  7

  3

  i j Pivô = 8

  L[i] >= Pivô?

  2

  8

  6

  10

  4

  7

  3

  i j Pivô = 8

  L[i] >= Pivô?

  2

  8

  6

  10

  4

  7

  3

  i j Pivô = 8

  “i” está parado. L[j] <= Pivô?

  Pivô = 8

  10

  8

  7

  6

  4

  3

  2

  i j

  “i” e “j” estão parados na mesma

  Pivô = 8

  10

  8

  7

  6

  4

  3

  2

  j i

  “i” e “j” avançam. Houve cruzamento e deve haver

  2

  8

  6

  10

  4

  7

   Implemente um programa, em python, que seja capaz de empregar o método

  Quick Sort na ordenação da seguinte lista L=[80, 20, 50, 33, 14, 90, 18, 35, 13, 28].

   SZWARCFITER, Jayme; MARKENZON, Lilian.

  Estruturas de Dados e seus Algoritmos, 3ª Edição.

   ZIVIANI, Nivio. Projeto de Algoritmos, 2ª Edição .

   MEDINA, Marco; FERTIG, Cristina. Algoritmos e Programação., 2ª Edição.

Novo documento