EDA Problema de la ordenación

Anuncio
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
Descargar