Escolar Documentos
Profissional Documentos
Cultura Documentos
1 Introdução
2 3
↓
9 4 10 2 6 17 8 12 7 15
Quer dizer,
1
E a ideia é que
#include <stdio.h>
#include <stdlib.h>
#define N 10
aux = L[i];
L[i] = L[j]; // troca
L[j] = aux;
}
int main ()
{
int k; // controle da repetiç~
ao
int p;
Troca ( L, p, k );
}
}
2
2 Ainda mais manipulação de listas
Legal.
Quer dizer, a gente também pode ordenar a lista por meio de varreduras.
1
(repetidor)
2 (varredor)
3 (trocador)
9 4 10 2 6 17 8 12 7 15
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main ()
{
int k; // controle da repetiç~
ao
Varredura ( L, 0, k );
}
3
Mais exemplos
Certo.
Mas a gente também pode fazer as coisas ao contrário.
Quer dizer, a ideia é fazer varreduras para a esquerda.
Onde as varreduras vão trazendo os elementos pequenos para o inı́cio da lista.
E as faixas da varredura vão ficando cada vez maiores
9 4 10 2 6 17 8 12 7 15
...
Para implementar essa ideia, a gente vai utilizar 3 bonequinhos mais uma vez
1
(repetidor)
9 4 10 2 6 17 8 12 7 15
3 (trocador)
2 (varredor)
( ... )
4
int main ()
{
int k; // controle da repetiç~
ao
Varredura_para_esquerda ( L, 0, k );
}
b. Metades ordenadas
Agora imagine que nós temos uma lista onde a primeira e a segunda metades já estão ordenadas
Por exemplo,
L 2 6 7 10 13 5 8 9 12 15
A tarefa consiste em
Os dois primeiros dedos vão sendo deslocados para o fim das suas metades.
E o menor elemento apontado por esses dedos é copiado para a lista auxiliar.
i j
↓ ↓
L 2 6 7 10 13 5 8 9 12 15
? 2
A
↑
k
5
Quer dizer,
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int i = 0, j = N/2, k = 0; // 3 dedos
int m;
int A[N];
if ( m == 1 ) i++;
else j++;
k++;
}
6
c. Mais um método de ordenação
Certo.
Agora está na hora de encaixotar tudo o que a gente fez na aula de hoje.
Mas para fazer isso, é preciso dar nomes aos bois.
O método de ordenação que nós vimos na Introdução é chamado de ordenação por seleção
— (porque?)
E agora, nós podemos colocá-lo dentro da sua caixinha
Daı́, o método que nós vimos no inı́cio dessa seção é chamado de ordenação da bolha
— (porque?)
E agora, nós podemos colocá-lo dentro da sua caixinha
Daı́, o método que nós vimos no inı́cio dessa seção é chamado de ordenação por inserção
— (porque?)
E agora, nós podemos colocá-lo dentro da sua caixinha
void Ord_Inserç~
ao ( int L[], int tam )
{
int k;
7
Daı́, o procedimento que nós vimos no exemplo (b) é chamado de intercalação
— (porque?)
E agora, nós podemos colocá-lo dentro da sua caixinha
void Intercalaç~
ao ( int L[], int tam )
{
int i = 0, j = tam/2, k = 0; // 3 dedos
int m;
int A[tam];
if ( m == 1 ) i++;
else j++;
k++;
}
Legal.
Muito bom.
Agora tudo está encaixotado.
E agora nós podemos fazer algumas observações interessantes.
A primeira delas é que os 3 métodos de ordenação são bem parecidos, mas eles não são a mesma
coisa.
Quer dizer, se a gente ordenar uma lista muito, muito grande com os 3 métodos, a gente vai ver
que
Veja só
— (porque?)
Mas, isso ainda não é o mais legal.
Quer dizer, agora que tudo está encaixotado, a gente pode pensar em ainda mais um método de
ordenação.
Quer dizer, a ideia é muito simples.
Nós já sabemos fazer a intercalação, não é?
=⇒
8
Então, basta usar uma das 3 caixinhas para ordenar as duas metades, e depois aplicar a intercalação
=⇒
=⇒
#include <stdio.h>
#include <stdlib.h>
#define N 10
( ... )
int main()
{
Ordena ( L, 0, N/2 - 1); // a sua caixinha favorita de ordenaç~
ao
Intercalacao ( L, N );
}
Sim, é legal.
O nome desse métod é ordenação via intercalação.
E agora, nós também podemos colocá-lo dentro de uma caixinha
int Ord_intercalacao()
{
Ordena ( L, 0, N/2 - 1); // a sua caixinha favorita de ordenaç~
ao
Intercalacao ( L, N );
}
Bom, a boa notı́cia é que a ordenação por intercalação é ainda mais rápida do que a ordenação
por inserção — (quando a lista é muito, muito grande ...)
ord inserç~
ao: .....
ord intercalaç~
ao: .....
— (porque?)
9
Ora, mas quando a gente fica sabendo disso, a gente acaba tendo outra ideia.
Quer dizer, olhe outra vez para o esquema da ordenação por intercalação
=⇒
=⇒
Na primeira etapa a gente ordena as duas metades usando uma das nossas 3 caixinhas de
ordenação.
Mas, peraı́!
A ordenação por intercalação é mais rápida do que qualquer uma das 3 caixinhas.
Então, faz sentido ordenar as metades usando a ordenação via intercalação
Intercalacao ( L, N );
Isso nos dá um novo método de ordenação, que a gente pode colocar dentro de uma caixinha.
Mas para isso, é preciso ter um nome.
E para dar o nome, é preciso entender como ele funciona.
Quer dizer, o que está acontecendo é o seguinte
=⇒ (ordenação)
=⇒ (intercalação)
=⇒ (intercalação)
Logo, a gente pode chamar esse método de ordenação via intercalação dupla.
int Ord_intercalacao_dupla()
{
Ordena ( L, 0, N/2 - 1); // a sua caixinha favorita de ordenaç~
ao
Intercalacao ( L, N );
}
10