24.10.2014 Views

Divide y Vencerás - UPV

Divide y Vencerás - UPV

Divide y Vencerás - UPV

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

EDA<br />

2004/2005<br />

Problema de la ordenación<br />

El problema de la ordenación de un vector a de Objetos<br />

Comparable (los elementos del array, de tipo Object,<br />

deben implementar el interfaz Comparable)<br />

Talla del problema: n==a.length<br />

Algoritmos:<br />

o Burbuja: t bur (n) ∈ Θ(n 2 )<br />

o Inserción Directa: t ins (n) ∈ Ω(n) t ins (n) ∈ Ο(n 2 )<br />

o Selección Directa: t sel (n) ∈ Θ(n 2 )<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

Problema de la ordenación<br />

public static void insercionDirecta (Object a[]) {<br />

for( int i = 1; i < a.length ; i++ ) {<br />

Comparable elemAInsertar = (Comparable)a[i];<br />

int posIns = i ;<br />

// Busqueda del lugar de insercion ordenada;<br />

// desplazar mientras NO se encuentre<br />

for( ; posIns > 0 && elemAInsertar.compareTo(a[posIns-<br />

1]) < 0 ; posIns--)<br />

}<br />

}<br />

a[posIns] = a[posIns - 1];<br />

a[posIns] = elemAInsertar; // Insercion en posIns<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

Problema de la ordenación<br />

public static void seleccionDirecta (Object a[]) {<br />

for (int i=0; i


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás<br />

Algoritmos:<br />

o MergeSort: t merSort (n) ∈ Θ(n*log 2 n)<br />

oQuickSort (Hoare, 1960): t quickSort (n) ∈ Ω (n*log 2 n)<br />

t quickSort (n) ∈ Ο(n 2 )<br />

coste medio t µ quickSort (n) ∈ Θ(n*log 2 n)<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: MergeSort<br />

1 2 2 3 4 5 6 6<br />

MERGE<br />

2 4 5 6 1 2 3 6<br />

MERGE<br />

2 5 4 6<br />

1 3 2 6<br />

MERGE MERGE MERGE<br />

5 2 4 6 1 3 2 6<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: MergeSort<br />

public static void mergeSort (Object a[]){<br />

Object tmpArray = new Object[a.length];<br />

mergeSort (a, tmpArray, 0, a.length-1);<br />

}<br />

private static void mergeSort (Object a[],<br />

Object [] tmpArray, int izq, int der){<br />

if (izq < der) {<br />

int medio = (izq+der) / 2;<br />

mergeSort(a, tmpArray, izq, medio);<br />

mergeSort(a, tmpArray, medio+1, der);<br />

merge(a, tmpArray, izq, medio+1, der);<br />

}<br />

}<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: MergeSort<br />

public static void merge(Object [] a, Object [] tmpArray,<br />

int posIzq, int posDer, int finDer) {<br />

int finIzq = posDer–1; int tmpPos = posIzq;<br />

int numEl = finDer – posIzq +1;<br />

while (posIzq


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: MergeSort<br />

Coste MergeSort<br />

• si se descompone el problema original en dos subproblemas balanceados:<br />

t merSort (n) ˛ Q(n*log 2 n)<br />

Coste Merge: t merge (n) ∈ Θ(n)<br />

Caso 4 Teorema (con a==c==2):<br />

f(n) = a*f(n/c) + b*n + d a < c ⇒ Θ(n)<br />

a = c ⇒ Θ(n log c n)<br />

a > c ⇒ Θ(n log c a )<br />

• sino, si por ejemplo se descompone el problema original en dos<br />

subproblemas de talla n-1 y 1 (problema de balanceo): t merSort (n) ∈ Θ(n 2 )<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: QuickSort<br />

65<br />

13 81 92 43 65<br />

31 57 26<br />

75 0<br />

Partición<br />

Selección<br />

pivote<br />

QuickSort<br />

13 0 26<br />

43 57 31<br />

65<br />

92 75<br />

81<br />

QuickSort<br />

0 13 26 31 43 57 65 75 81 92<br />

0 13 26 31 43 57 65 75 81 92<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: QuickSort<br />

public static void quickSort(Object a[], int izq, int der ){<br />

}<br />

}<br />

if( izq


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: QuickSort<br />

private static Comparable mediana3 (Object a[], int izq,<br />

int der ){<br />

int c=(izq+der)/2;<br />

if (((Comparable)a[c]).compareTo(a[izq])


EDA<br />

2004/2005<br />

<strong>Divide</strong> y Vencerás: QuickSort<br />

Coste QuickSort<br />

t quickSort (n) ∈ Ω (n*log 2 n)<br />

t quickSort (n) ∈ Ο(n 2 )<br />

coste medio t µ quickSort (n) ∈ Θ(n*log 2 n)<br />

Talla_subproblemas probabilidad<br />

1 n-1 1/n<br />

2 n-2 ...<br />

...<br />

n-1 1<br />

Paolo Rosso Grupos: 2B+ENG - ETSIA

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!