EDA 2004/2005 Problema de la ordenación El problema de la ordenación de un vector a de Objetos Comparable (los elementos del array, de tipo Object, deben implementar el interfaz Comparable) Talla del problema: n==a.length Algoritmos: o Burbuja: tbur (n) ∈ Θ(n2 ) o Inserción Directa: tins(n) ∈ Ω(n) tins(n) ∈ Ο(n2) o Selección Directa: tsel (n) ∈ Θ(n2 ) Paolo Rosso Grupos: 2B+ENG - ETSIA 1 EDA 2004/2005 Problema de la ordenación public static void insercionDirecta (Object a[]) { for( int i = 1; i < a.length ; i++ ) { Comparable elemAInsertar = (Comparable)a[i]; int posIns = i ; // Busqueda del lugar de insercion ordenada; // desplazar mientras NO se encuentre for( ; posIns > 0 && elemAInsertar.compareTo(a[posIns1]) < 0 ; posIns--) a[posIns] = a[posIns - 1]; a[posIns] = elemAInsertar; // Insercion en posIns } } Paolo Rosso Grupos: 2B+ENG - ETSIA 2 EDA 2004/2005 Problema de la ordenación public static void seleccionDirecta (Object a[]) { for (int i=0; i<a.length-1; i++) { int posMin = i; for (int j=i+1; j<a.length; j++) if (((Comparable)a[j]).compareTo(a[posMin])<0) posMin = j; intercambiar(a,i,posMin); } } Paolo Rosso Grupos: 2B+ENG - ETSIA 3 EDA 2004/2005 Divide y Vencerás Algoritmos: o MergeSort: tmerSort(n) ∈ Θ(n*log2n) o QuickSort (Hoare, 1960): tquickSort(n) ∈ Ω (n*log2n) tquickSort(n) ∈ Ο(n2 ) coste medio tµquickSort(n) ∈ Θ(n*log2n) Paolo Rosso Grupos: 2B+ENG - ETSIA 4 EDA 2004/2005 Divide y Vencerás: MergeSort 1 2 2 3 4 5 6 6 MERGE 2 4 5 6 1 2 3 6 MERGE 2 5 4 MERGE 5 2 1 6 3 6 6 MERGE MERGE 4 2 1 3 2 6 Paolo Rosso Grupos: 2B+ENG - ETSIA 5 EDA 2004/2005 Divide y Vencerás: MergeSort public static void mergeSort (Object a[]){ Object tmpArray = new Object[a.length]; mergeSort (a, tmpArray, 0, a.length-1); } private static void mergeSort (Object a[], Object [] tmpArray, int izq, int der){ if (izq < der) { int medio = (izq+der) / 2; mergeSort(a, tmpArray, izq, medio); mergeSort(a, tmpArray, medio+1, der); merge(a, tmpArray, izq, medio+1, der); } } Paolo Rosso Grupos: 2B+ENG - ETSIA 6 EDA 2004/2005 Divide y Vencerás: MergeSort public static void merge(Object [] a, Object [] tmpArray, int posIzq, int posDer, int finDer) { int finIzq = posDer–1; int tmpPos = posIzq; int numEl = finDer – posIzq +1; while (posIzq <= finIzq && posDer <= finDer) if (((Comparable)a[posIzq]).compareTo(a[posDer])<0)) tmpArray[tmpPos++] = a[posIzq++]; else tmpArray[tmpPos++] = a[posDer++]; while (posIzq <= finIzq) tmpArray[tmpPos++] = a[posIzq++]; while (posDer <= finDer) tmpArray[tmpPos++] = a[posDer++]; for (int i=0; i<numEl; i++, finDer--) a[finDer]=tmpArray[finDer]; } Paolo Rosso Grupos: 2B+ENG - ETSIA 7 EDA 2004/2005 Divide y Vencerás: MergeSort Coste MergeSort • si se descompone el problema original en dos subproblemas balanceados: tmerSort(n) ∈ Θ(n*log2n) Coste Merge: tmerge(n) ∈ Θ(n) Caso 4 Teorema (con a==c==2): f(n) = a*f(n/c) + b*n + d a<c a=c a>c ⇒ ⇒ ⇒ Θ(n) Θ(n logcn) Θ(nlogca) • sino, si por ejemplo se descompone el problema original en dos subproblemas de talla n-1 y 1 (problema de balanceo): tmerSort(n) ∈ Θ(n2) Paolo Rosso Grupos: 2B+ENG - ETSIA 8 EDA 2004/2005 Divide y Vencerás: QuickSort 13 13 0 26 43 57 31 81 92 43 65 65 31 57 26 75 0 Partición 65 Selección pivote 92 75 81 QuickSort QuickSort 0 13 26 31 43 57 65 75 81 92 0 13 26 31 43 57 65 75 81 92 Paolo Rosso Grupos: 2B+ENG - ETSIA 9 EDA 2004/2005 Divide y Vencerás: QuickSort public static void quickSort(Object a[], int izq, int der ){ if( izq<der ){ // pivot como mediana de 3 elementos Comparable pivot=mediana3(a,izq,der); // mejor que pivot=a[izq] int i=izq; int j=der-1; for( ; i<j; ){ while(pivot.compareTo(a[++i])>0) {} while(pivot.compareTo(a[--j])<0) {} intercambiar (a,i,j); } intercambiar (a,i,j); // Deshacer el ultimo cambio intercambiar (a,i,der-1); // Restaurar el pivote quickSort(a,izq,i-1); // Ordenar los elementos menores quickSort(a,i+1,der); // Ordenar los elementos mayores } } Paolo Rosso Grupos: 2B+ENG - ETSIA 10 EDA 2004/2005 Divide y Vencerás: QuickSort private static Comparable mediana3 (Object a[], int izq, int der ){ int c=(izq+der)/2; if (((Comparable)a[c]).compareTo(a[izq])<0) intercambiar (a,izq,c); if (((Comparable)a[der]).compareTo(a[izq])<0) intercambiar (a,izq,der); if (((Comparable)a[der]).compareTo(a[c])<0) intercambiar (a,c,der); // (ocultar el pivote en la posicion der-1 intercambiar(a,c,der-1); return (Comparable)a[der-1]; } Paolo Rosso Grupos: 2B+ENG - ETSIA 11 EDA 2004/2005 Divide y Vencerás: QuickSort Coste QuickSort tquickSort(n) ∈ Ω (n*log2n) tquickSort(n) ∈ Ο(n2) coste medio tµquickSort(n) ∈ Θ(n*log2n) Talla_subproblemas probabilidad 1 n-1 1/n 2 n-2 ... ... n-1 1 Paolo Rosso Grupos: 2B+ENG - ETSIA 12