Sunteți pe pagina 1din 34

ECT2303 – Linguagem de Programação

Aula 17 þ Algoritmos de Ordenação

Einstein Santos

UFRN

28 de setembro de 2018

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 1 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 2 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 3 / 34


Ordenação
Definição de ordenação

É o processo pelo qual uma sequência qualquer de dados é posta em


uma determinada ordem (geralmente crescente ou decrescente).
As ordens mais usadas são a numérica e a lexicográfica.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 4 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 5 / 34


Algoritmos de ordenação
Algoritmos de ordenação simples

í Alguns métodos simples:

Bubble sort (ordenação bolha);


Selection sort (ordenação por seleção);
Insertion sort (ordenação por inserção);
Comb sort (ordenação pente).

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 6 / 34


Algoritmos de ordenação
Algoritmos de ordenação sofisticados

í Alguns métodos sofisticados:

Merge sort;
Heap sort;
Quick sort;
Bucket sort;
Shell sort;
Gnome sort;
Count sort;
Cocktail sort;
Tim sort;
Radix sort.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 7 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 8 / 34


Ordenação Bolha (“Bubble Sort”)
Objetivo

A idéia da Ordenação Bolha é fazer “flutuar” o maior elemento para o


fim da sequência.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 9 / 34


Ordenação Bolha (“Bubble Sort”)
Exemplo de aplicação

í Exemplo: Aplique o método de Ordenação Bolha na sequência


abaixo de modo a ordená-la crescentemente:

5 1 12 -5 16

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 10 / 34


Ordenação Bolha (“Bubble Sort”)
Exemplo de aplicação (cont.)

[5] [1] 12 -5 16 -> (5 > 1) TROCA


1 [5] [12] -5 16 -> (5 < 12) MANTÉM
1 5 [12] [-5] 16 -> (12 > -5) TROCA
1 5 -5 [12] [16] -> (12 < 16) MANTÉM

[1] [5] -5 12 {16} -> (1 < 5) MANTÉM


1 [5] [-5] 12 {16} -> (5 > -5) TROCA
1 -5 [5] [12] {16} -> (5 < 12) MANTÉM

[1] [-5] 5 {12} {16} -> (1 > -5) TROCA


-5 [1] [5] {12} {16} -> (1 > -5) MANTÉM

[-5] [1] {5} {12} {16} -> (-5 < 1) MANTÉM

-5 1 5 12 16 -> ORDENADO!

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 11 / 34


Ordenação Bolha (“Bubble Sort”)
Implementação

1 void metodo_bolha ( int v [] , int n )


2 {
3 int i , j ;
4
5 for ( i = n -1; i >= 1; i - -) {
6 for ( j = 0; j < i ; j ++) {
7 if ( v [ j ] > v [ j +1])
8 troca (v ,j , j +1) ;
9 }
10 }
11 }
12
13 void troca ( int v [] , int a , int b )
14 {
15 int aux ;
16
17 aux = v [ a ];
18 v [ a ] = v [ b ];
19 v [ b ] = aux ;
20 }

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 12 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 13 / 34


Ordenação por Seleção (“Selection Sort”)
Objetivo

A idéia da Ordenação por Seleção é procurar o menor elemento da


sequência (ou maior) e movimentá-lo para a primeira (última) posição
da sequência.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 14 / 34


Ordenação por Seleção (“Selection Sort”)
Exemplo de aplicação

í Exemplo: Aplique o método de Ordenação por Seleção na sequência


abaixo de modo a ordená-la crescentemente:

7459821

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 15 / 34


Ordenação por Seleção (“Selection Sort”)
Exemplo de aplicação (cont.)

[7] 4 5 9 8 2 [1] -> (1 << 7) TROCA


1 [4] 5 9 8 [2] 7 -> (2 << 4) TROCA
1 2 [5] 9 8 [4] 7 -> (4 << 5) TROCA
1 2 4 [9] 8 [5] 7 -> (5 << 9) TROCA
1 2 4 5 [8] 9 [7] -> (7 << 8) TROCA
1 2 4 5 7 [9] [8] -> (8 << 9) TROCA
1 2 4 5 7 8 [9] -> (! << 9) MANTÉM

1 2 4 5 7 8 9 -> ORDENADO!

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 16 / 34


Ordenação por Seleção (“Selection Sort”)
Implementação

1 void meto do_selec ao ( int v [] , int n )


2 {
3 int i , j , min ;
4
5 for ( i =0; i <n -1; i ++) {
6 min = i ;
7 for ( j = i +1; j < n ; j ++) {
8 if ( v [ j ] < v [ min ])
9 min = j ;
10 }
11 troca (v ,i , min ) ;
12 }
13 }
14
15 void troca ( int v [] , int a , int b )
16 {
17 int aux ;
18
19 aux = v [ a ];
20 v [ a ] = v [ b ];
21 v [ b ] = aux ;
22 }

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 17 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 18 / 34


Ordenação por Inserção (“Insertion Sort”)
Objetivo

A idéia da Ordenação por Inserção é dividir os elementos de uma


sequência em duas subsequências, uma com os elementos já orde-
nados e outra com elementos ainda por ordenar.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 19 / 34


Ordenação por Inserção (“Insertion Sort”)
Exemplo de aplicação

í Exemplo: Aplique o método de Ordenação por Inserção na sequência


abaixo de modo a ordená-la crescentemente:

524613

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 20 / 34


Ordenação por Inserção (“Insertion Sort”)
Exemplo de aplicação (cont.)

[5] 2 4 6 1 3 -> (5 < !) MANTÉM


[5] [2] 4 6 1 3 -> (2 < 5) TROCA
[2] [5] [4] 6 1 3 -> (4 < 5) TROCA
[2] [4] [5] [6] 1 3 -> (6 < !) MANTÉM
[2] [4] [5] [6] [1] 3 -> (1 < 2) TROCA
[1] [2] [4] [5] [6] [3] -> (3 < 4) TROCA
[1] [2] [3] [4] [5] [6] -> (6 < !) MANTÉM

1 2 3 4 5 6 -> ORDENADO!

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 21 / 34


Ordenação por Inserção (“Insertion Sort”)
Implementação

1 void m et od o_ i ns er ca o ( int v [] , int n )


2 {
3 int i , j ;
4
5 for ( i = 1; i < n ; i ++) {
6 for ( j = i ; j >0; j - -) {
7 if ( v [ j ] < v [j -1])
8 troca (v ,j ,j -1) ;
9 else
10 break ;
11 }
12 }
13 }
14
15 void troca ( int v [] , int a , int b )
16 {
17 int aux ;
18
19 aux = v [ a ];
20 v [ a ] = v [ b ];
21 v [ b ] = aux ;
22 }

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 22 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 23 / 34


Ordenação Rápida (“Quick Sort”)
Objetivo

O método ordenação Quicksort adota a estratégia de divisão e con-


quista. A estratégia consiste em rearranjar os termos de uma sequên-
cia de modo que os termos menores precedam os termos maiores.
Em seguida o Quicksort ordena as duas subsequências de termos
menores e maiores recursivamente até que a sequência completa se
encontre ordenada.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 24 / 34


Ordenação Rápida (“Quick Sort”)
Passos do algoritmo do método Quicksort

1 Escolher um termo da sequência denominado pivô;


2 Rearranjar os termos da sequência de modo que todos os elementos
à direita do pivô sejam maiores que ele e os da esquerda menores
(duas partições); e
3 Ordenar recursivamente as duas partições criadas.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 25 / 34


Ordenação Rápida (“Quick Sort”)
Exemplo de aplicação

í Exemplo: Aplique o método de Ordenação Rápida na sequência


abaixo de modo a ordená-la crescentemente:

1 12 5 26 7 14 3 7 2

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 26 / 34


Ordenação Rápida (“Quick Sort”)
Exemplo de aplicação (cont.)

1 12 5 26 7 14 3 7 2 --> 1 12 5 26 7 14 3 7 2 -->
(i) (p) (j) (i) (p) (j)

1 2 5 26 7 14 3 7 12 --> 1 2 5 26 7 14 3 7 12 -->
(i) (p) (j) (i) (p) (j)

1 2 5 7 7 14 3 26 12 --> 1 2 5 7 3 14 7 26 12 -->
(i,p) j (i,j) (p)

1 2 5 7 3 14 7 26 12 --> 1 2 5 7 3 | 14 7 26 12
(j)(i)

1 2 5 7 3 --> 1 2 5 7 3 --> 1 2 3 7 5 -->


(i) (p) (j) (i,p) (j) (i,j) (p)

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 27 / 34


Ordenação Rápida (“Quick Sort”)
Exemplo de aplicação (cont.)

1 2 3 7 5 --> 1 2 3 | 7 5
(j) (i,p)

1 2 3 --> 1 2 3 --> 1 2 3 --> {1} | 2 3


(i) (p) (j) (i,p,j) (j) (p) (i)

2 3 --> 2 3 --> 2 3 --> {2} | {3}


(p,i) (j) (p,i,j) j (p) (i)

7 5 --> 5 7 --> {5} | {7}


(p,i) (j) (j) (p,i)

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 28 / 34


Ordenação Rápida (“Quick Sort”)
Exemplo de aplicação (cont.)

14 7 26 12 --> 14 7 26 12 --> 7 14 26 12 -->


(i) (p) (j) (i) (j,p) (j,p) (i)

{7} | 14 26 12

14 26 12 --> 14 26 12 --> 14 12 26 -->


(i) (p) (j) (p,i) (j) (j) (i,p)

14 12 | {26}

14 12 --> 12 14 --> {12} | {14}


(p,i) (j) (j) (i,p)

1 2 3 5 7 7 12 14 26 -> ORDENADO!

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 29 / 34


Ordenação Rápida (“Quick Sort”)
Implementação

1 void quicksort ( int v [] , int inicio , int fim )


2 {
3 int i , j ;
4
5 i = inicio ;
6 j = fim -1;
7
8 particao (v , inicio , fim ,i , j ) ;
9
10 if ( j > inicio )
11 quicksort (v , inicio , j +1) ;
12 if ( i < fim )
13 quicksort (v , i , fim ) ;
14 }

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 30 / 34


Ordenação Rápida (“Quick Sort”)
Implementação (cont.)

1 void particao ( int v [] , int inicio , int fim , int & i , int & j )
2 {
3 int pivo , aux ;
4 pivo = v [( inicio + fim ) / 2];
5
6 while ( i <= j ) {
7 while (( v [ i ] < pivo ) && ( i < fim ) ) {
8 i ++;
9 }
10 while (( v [ j ] > pivo ) && ( j > inicio ) ) {
11 j - -;
12 }
13 if ( i <= j ) {
14 aux = v [ i ];
15 v [ i ] = v [ j ];
16 v [ j ] = aux ;
17 i ++;
18 j - -;
19 }
20 }
21 }

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 31 / 34


Sumário

1 Ordenação

2 Algoritmos de ordenação

3 Ordenação Bolha (“Bubble Sort”)

4 Ordenação por Seleção (“Selection Sort”)

5 Ordenação por Inserção (“Insertion Sort”)

6 Ordenação Rápida (“Quick Sort”)

7 Exercícios

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 32 / 34


Exercícios

1. Escreva um programa em C++ que leia um vetor de inteiros de tama-


nho n e que utilize uma função auxiliar para calcular a média aritmética
dos k elementos maiores.
2. Faça um programa em C++ que receba uma cadeia de caracteres e
que ordene alfabeticamente os seus caracteres.
3. Escreva um programa em C++ que leia um vetor de reais de tamanho
n e que utilize uma função auxiliar para ordená-lo decrescentemente,
armazenando a nova sequência em um outro vetor. Uma segunda fun-
ção auxiliar deve ser utilizada para normalizar os elementos do vetor
anterior, armazenando o resultado em um novo vetor. O vetor norma-
lizado deve ser exibido.

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 33 / 34


Algoritmos de Ordenação

Fim da aula 17

Einstein Santos (UFRN) ECT2303 – Linguagem de Programação 28 de setembro de 2018 34 / 34