Você está na página 1de 52

Estrutura de Dados

Ordenação: Métodos Simples

Professores: Luiz Chaimowicz e Raquel Prates


MÉTODO DE INSERÇÃO
EXPLICAÇÃO

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n Algoritmo utilizado pelo jogador de cartas
q As cartas são ordenadas da esquerda para direita
uma a uma.
q O jogador escolhe a segunda carta e verifica se
ela deve ficar antes ou na posição que está.
q Depois a terceira carta é classificada,
deslocando-a até sua correta posição.
q O jogador realiza esse procedimento até ordenar
todas as cartas.

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
108
MÉTODO DE INSERÇÃO
CÓDIGO

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) { Para cada elemento do vetor
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux; Acha a posição
} do elemento
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) { Para cada elemento do vetor
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux; Acha a posição
Não é o 1º.
} Elemento da do elemento
elemento do
esquerda for
} vetor
maior

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) { Para cada elemento do vetor
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux; Muda a Acha a posição
} posição do do elemento
elemento
} anterior

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) { Para cada elemento do vetor
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux; Acha a posição
} do elemento
}
Colocar o elemento
na posição correta

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=0
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
5 3 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=0
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
5 3 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=0
Item aux; menor?
0 1 2 3 4
for (i = 1; i < n; i++) {
5 3 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) && v[j]

(aux.Chave < v[j].Chave)) {


v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=0
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
5 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=-1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
5 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=1
void Insercao(Item *v, int n) { aux= 3
int i,j; j=-1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
35 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=1
Item aux; menor?
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 2 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) && v[j]

(aux.Chave < v[j].Chave)) {


v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=0
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=0
Item aux; menor?
0 1 2 3 4
for (i = 1; i < n; i++) {
3 5 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) && v[j]
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=0
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 3 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=-1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
3 3 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=2
void Insercao(Item *v, int n) { aux= 2
int i,j; j=-1
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
25 3 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção
n=5
i=3
void Insercao(Item *v, int n) {
int i,j;
...
Item aux;
0 1 2 3 4
for (i = 1; i < n; i++) {
2 3 5 1 4
aux = v[i];
j = i - 1;
while (( j >= 0 ) &&
(aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4 aux

5 3 2 1 4 3

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4 aux

5 5 2 1 4 3

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4 aux

3 5 2 1 4 3

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4 aux

3 5 2 1 4 2

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4 aux

3 5 5 1 4 2

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4 aux

3 3 5 1 4 2

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4 aux

2 3 5 1 4 2

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

2 3 5 1 4 1

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

2 3 5 5 4 1

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

2 3 3 5 4 1

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

2 3 3 5 4 1

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

2 2 3 5 4 1

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4 aux

1 2 3 5 4 1

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4

1 2 3 5 4
0 1 2 3 4 aux

1 2 3 5 4 4

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4

1 2 3 5 4
0 1 2 3 4 aux

1 2 3 5 5 4

menor?

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção

0 1 2 3 4

3 5 2 1 4
0 1 2 3 4

2 3 5 1 4
0 1 2 3 4

1 2 3 5 4
0 1 2 3 4 aux

1 2 3 4 5 4

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
MÉTODO DE INSERÇÃO
ANÁLISE

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método é estável?
0 1 2 3 4

3 5 2 5 4

0 1 2 3 4

2 3 5 5 4

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método é estável?
0 1 2 3 4

3 5 2 5 4

0 1 2 3 4 aux

2 3 5 5 4 5

menor?

NÃO! Não troca

É ESTÁVEL!

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção: Exemplos
n Melhor Caso:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6

n Pior Caso:
6 5 4 3 2 1
5 6 4 3 2 1
4 5 6 3 2 1
3 4 5 6 2 1
2 3 4 5 6 1
1 2 3 4 5 6
Estruturas de Dados – 2020-1
© Profs. Chaimowicz & Prates
154
Método Inserção - Número de Comparações

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) {
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--; Melhor caso: 1
} Pior caso: i
v[j + 1] = aux;
}
}

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção: Complexidade
n Comparações – C(n):
q Loop interno: i-ésima iteração, valor de Ci:
n melhor caso: Ci = 1
n pior caso: Ci = i
n -1
q Loop externo: å Ci
i =1

q Complexidade total:
n Melhor caso (itens já estão ordenados)
n -1
C ( n) = å 1 = n - 1 = O ( n)
i =1

n Pior caso (itens em ordem reversa):


(n - 1)(n) n 2 n
n -1
C (n) = å i = = - = O( n 2 )
i =1 2 2 2
Estruturas de Dados – 2020-1
© Profs. Chaimowicz & Prates
156
Método Inserção - Número de Movimentações

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) {
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = aux;
}
} Para cada iteração do
loop externo são 2 = 2(n-1)

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção - Número de Movimentações

void Insercao(Item *v, int n) {


int i,j;
Item aux;
for (i = 1; i < n; i++) {
aux = v[i];
j = i - 1;
while (( j >= 0 ) && (aux.Chave < v[j].Chave)) {
v[j + 1] = v[j];
j--; Melhor caso: 0
} Pior caso: i-1
v[j + 1] = aux;
}
} Para cada iteração do
loop externo são 2 = 2(n-1)

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
Método Inserção: Complexidade

n Movimentações - M(n):
q 2 movimentações no loop externo + 1 no loop
interno

q Melhor caso: 2(n-1) – nunca entra no loop


interno O(n)

q Pior caso: 2(n-1) + n(n-1)/2 – sempre entra no


loop interno: pior caso das comparações O(n2)

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
159
Método Inserção: Complexidade

n Comparações - C(n):
q Melhor caso: O(n)
q Pior caso: O(n2)
n Movimentações - M(n):
q Melhor caso: O(n)
q Pior caso: O(n2)

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
160
Método Inserção – Melhoria
n Uso de um sentinela
void Insercao(Item *v, Indice n){
Indice i, j; • Primeira posição válida
Item aux; do vetor é 1
for (i = 2; i <= n; i++){ • Posição 0: guarda sentinela
(valor sendo testado)
aux = v[i];
• Evita uma comparação de índice
j = i -1; a cada iteração ao custo de uma
V[0] = aux; /* sentinela */ eventual comparação de chaves
while (aux.Chave < v[j].Chave){
v[j+1] = v[j];
j--;
}
v[j+1] = aux;
}
}
Estruturas de Dados – 2020-1
© Profs. Chaimowicz & Prates
161
Método Inserção

n Vantagens:
q É o método a ser utilizado quando o arquivo está
“quase” ordenado.
q É um bom método quando se deseja adicionar
uns poucos itens a um arquivo ordenado, pois o
custo é linear.
q O algoritmo de ordenação por inserção é estável.

n Desvantagens:
q Alto custo de movimentação de elementos no
vetor.

Estruturas de Dados – 2020-1


© Profs. Chaimowicz & Prates
162

Você também pode gostar