Você está na página 1de 9

UNIVERSIDADE FEDERAL DE OURO PRETO

Instituto de Ciências Exatas e Biológicas

Programação de Computadores II
Algoritmos de ordenação

Prof. Maurı́cio José da Silva


DECOM - Departamento de Computação

6 de maio de 2014
Slide 1/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

Recursão
• Muitos problemas computacionais tem a propriedade de que
cada instância do problema contém uma instância menor do
problema.

• Caso o problema possa ser resolvido dessa forma, dizemos que


o problema tem estrutura recursiva.

• O seguinte método pode ser utilizado para resolver o problema:

Se a instância em questão é pequena,


resolva-a;
Senão
reduza-a a uma instância menor do mesmo problema,
aplique o método a instância menor,
volte a instância original. x

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 2/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

QuickSort
• Algoritmo de ordenação eficiente que tem como princı́pio de
dividir para conquistar. É um problema naturalmente recursivo.

• É um algoritmo que o tempo de execução no pior caso é O (n2 ),


porém, em média, seu tempo de execução é O (nlogn), o que o
torna uma das melhores opões práticas para ordenação.

• Seu funcionamento consiste em rearranjar um vetor, dividi-lo em


dois vetores menores; e fazer uma uma chamada a si mesmo
passando dois problema menores. Repete esse processo até
que todo o conjunto esteja ordenado.

• O algoritmo QuickSort realiza a ordenação in situ e não é estável,


ou seja, altera a ordem relativa dos elementos.

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 3/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

QuickSort
• Para ordenar, o algoritmo QuickSort seleciona um elemento no
vetor e o chama de pivo. Esse pivo será utilizado para rearranjar
o vetor, mantendo os elementos menores do que ele a sua
esquerda, e os elementos maiores do que ele a sua direita.

• Em seguida, ele divide o vetor em dois vetores menores, sendo


um com os elementos menores do que o pivo, e outro com os
elementos maiores do que o pivo;

• Apos divido, são feitas mais duas chamadas ao algoritmo


QuickSort passando as os dois vetores divididos.

• A escolha do pivo tem impacto direto no desempenho do


algoritmo.

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 4/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

Implementação QuickSort
void q u i c k S o r t ( int ∗ v e t o r , int tamanho ) {
p a r t i c i o n a ( v e t o r , 0 , tamanho −1) ;
}

void p a r t i c i o n a ( int ∗ v e t o r , int i n i c i o , int f i m ) {


int pivo , i , j , aux ;
i = i n i c i o ; j = fim ; pivo = vetor [ ( fim+ i n i c i o ) / 2 ] ;

do{
while ( v e t o r [ i ] < p i v o ) i ++;
while ( v e t o r [ j ] > p i v o ) j −−;

if ( i <= j ) {
aux = v e t o r [ i ] ;
vetor [ i ] = vetor [ j ] ;
v e t o r [ j ] = aux ;
i ++; j −−;
}
}while ( i <= j ) ;

if ( i n i c i o < j )
p a r t i c i o n a ( vetor , i n i c i o , j ) ;

if ( i < f i m )
p a r t i c i o n a ( vetor , i , fim ) ;
}
Prof. Maurı́cio José da Silva — Programação de Computadores II
Slide 5/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

MergeSort
• Algoritmo de ordenação eficiente também baseado no princı́pio
de dividir para conquistar.

• Seu funcionamento consistem em:

• Dividir o vetor ao meio e fazer uma nova chamada para cada parte
do vetor, quando o vetor tiver tamanho de 1 elemento ele está
naturalmente ordenado;

• Conquistar os vetores ordenados intercalando seus elementos e


retornado para a chamada acima;

• Combinar as partes dos vetores ordenados até que se chegue a


solução final.

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 6/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

Implementação MergeSort

void mergeSort ( int ∗ v e t o r , int tamanho ) {

d i v i d e ( v e t o r , 0 , tamanho −1) ;
}

void d i v i d e ( int ∗ v e t o r , int i n i c i o , int f i m ) {

int meio = ( f i m + i n i c i o ) / 2 ;

if ( i n i c i o < f i m ) {
d i v i d e ( v e t o r , i n i c i o , meio ) ;
d i v i d e ( v e t o r , meio +1 , f i m ) ;
i n t e r c a l a ( v e t o r , i n i c i o , meio , f i m ) ;
}
}

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 7/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

Implementação MergeSort
void i n t e r c a l a ( int ∗ v e t o r , int i n i c i o , int meio , int f i m ) {

int ∗aux , i , j , k ;
aux = new int [ fim − i n i c i o + 1 ] ;

i = inicio ;
j = meio + 1 ;
k = 0;

while ( i <= meio && j <= f i m ) {


if ( v e t o r [ i ] < v e t o r [ j ] ) {
aux [ k ++] = v e t o r [ i + + ] ;
}else{
aux [ k ++] = v e t o r [ j + + ] ;
}
}

while ( i <= meio )


aux [ k ++] = v e t o r [ i + + ] ;

while ( j <= f i m )
aux [ k ++] = v e t o r [ j + + ] ;

for ( int i =0; i <k ; i ++) {


v e t o r [ i n i c i o + i ] = aux [ i ] ;
}
}
Prof. Maurı́cio José da Silva — Programação de Computadores II
Slide 8/1
UNIVERSIDADE FEDERAL DE OURO PRETO ICEB - DECOM

Compração entre os algoritmos


Utilizem os conceitos aprendidos nas aulas para preencherem a
seguinte tabela.

Ordenação:
Ordem de complexidade
Método In Situ Estável
Pior Caso Caso Médio Melhor Caso

BubbleSort
SelectionSort
InsertionSort
QuickSort
MergeSort

Pesquisa:
Ordem de complexidade
Método
Pior Caso Caso Médio Melhor Caso

Pesquisa Sequencial
Pesquisa Binária

Prof. Maurı́cio José da Silva — Programação de Computadores II


Slide 9/1

Você também pode gostar