Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algorit Interes PDF
Algorit Interes PDF
Algoritmos de ordenación
Algoritmos básicos: Θ(n2)
Ordenación por inserción
Ordenación por selección
Ordenación por intercambio directo (burbuja)
Algoritmos más eficientes
Mergesort
Quicksort
Heapsort
Shellsort
Algoritmos para casos especiales
Binsort (ordenación por urnas)
1
…
Introducción
Introducción
Observaciones
Aplicaciones
Aplicaciones evidentes:
evidentes:
Mostrar los ficheros de un directorio.
directorio.
Mostrar un listado ordenado del contenido de una base de
datos (p.ej.
p.ej. listado alfabético).
alfabético).
Ordenar los resultados de una búsqueda en Internet (p.ej
(p.ej..
Google PageRank
PageRank). ).
7
Ordenación por selección
void selectionSort (double v[])
{
double tmp
tmp;
;
int i, j, pos_min
pos_min;
;
int N = v.length
v.length;
;
for (i
(i=0; i<N-
<N-1; i++) {
tmp = v[
v[i
i];
v[i
v[i] = v[
v[pos_min
pos_min];
];
v[pos_min
v[pos_min]
] = tmp
tmp;
;
}
} 8
for (i
(i=0; i<N-
<N-1; i++) {
tmp = v[
v[i
i];
v[i
v[i] = v[
v[pos_min
pos_min];
];
v[pos_min
v[pos_min]
] = tmp
tmp;
;
}
} 9
Ordenación por inserción
En cada iteración, se inserta un elemento del
subvector no ordenado en la posición correcta dentro
del subvector ordenado.
10
11
Ordenación por inserción
void insertionSort (double v[])
{
double tmp
tmp;
;
int i, j;
int N = v.length
v.length;
;
for (i
(i=1; i<N; i++) {
tmp = v[
v[i
i];
for (j=
(j=i
i; (j>0) && (
(tmp
tmp<v[j
<v[j-
-1]); j
j--
--)
)
v[j] = v[j-
v[j-1];
v[j] = tmp
tmp;
;
}
}
12
Método de la burbuja
Ordenación por intercambio directo
IDEA: Los elementos más ligeros ascienden
13
Método de la burbuja
void bubbleSort (double v[])
{
double tmp
tmp;
;
int i,j
i,j;
;
int N = v.length
v.length;
;
14
Método de la burbuja
Mejora: Usar un centinela y terminar cuando en una
iteración del bucle interno no se produzcan intercambios.
void bubbleSort
bubbleSort(
(double
double[]
[] v)
{
boolean swapped = true;
int i, j = 0;
double tmp
tmp;
;
while (swapped
swapped)
) {
swapped = false;
j++;
j++;
for (i = 0; i < v.length - j; i++)
if (v[i] > v[i + 1]) {
tmp = v[i];
v[i] = v[i + 1];
v[i + 1] = tmp
tmp;
;
swapped = true;
}
} 15
}
Análisis de eficiencia
Ordenación por selección
N2/2 comparaciones y N intercambios.
Mergesort
Algoritmo de ordenación “divide y vencerás”:
1. Dividir nuestro conjunto en dos mitades.
2. Ordenar recursivamente cada mitad.
3. Combinar las dos mitades ordenadas: O(n).
17
Mergesort
A L G O R I T H M S
A L G O R I T H M S Dividir O(1)
A G L O R H I M S T Ordenar 2T(n/2)
A G H I L M O R S T Mezclar O(n)
18
Mergesort
¿Cómo combinar eficientemente dos listas ordenadas?
Usando un array auxiliar y un número lineal de comparaciones:
Controlar la posición del elemento más pequeño en cada mitad.
Añadir el más pequeño de los dos a un vector auxiliar.
Repetir hasta que se hayan añadido todos los elementos.
A G L O R H I M S T
Optimización: “In-
“In-place merge”
merge” ((Kronrud
Kronrud,, 1969) 19
Cantidad constante de almacenamiento extra.
Mergesort
A G L O R H I M S T
A G L O R H I M S T
A G
20
Mergesort
A G L O R H I M S T
A G H
A G L O R H I M S T
A G H I
21
Mergesort
A G L O R H I M S T
A G H I L
A G L O R H I M S T
A G H I L M
22
Mergesort
A G L O R H I M S T
A G H I L M O
A G L O R H I M S T
A G H I L M O R
23
Mergesort
A G L O R H I M S T
A G H I L M O R S
A G L O R H I M S T
A G H I L M O R S T
24
Mergesort
¿Cómo combinar dos listas ordenadas eficientemente?
Usando un array auxiliar y un número lineal de comparaciones:
Controlar la posición del elemento más pequeño en cada mitad.
Añadir el más pequeño de los dos a un vector auxiliar.
Repetir hasta que se hayan añadido todos los elementos.
A G L O R H I M S T
Optimización: “In-
“In-place merge”
merge” ((Kronrud
Kronrud,, 1969) 25
Cantidad constante de almacenamiento extra.
Mergesort
26
Mergesort:: Eficiencia
Mergesort
1, n =1
T ( n) =
2T ( n / 2) + n, n > 1
T(n) n
...
T(2) T(2) T(2) T(2) T(2) T(2) T(2) T(2) n/2 (2)
27
n log2n
Mergesort:: Eficiencia
Mergesort
1, n =1
T ( n) =
2T ( n / 2) + n, n > 1
Expandiendo la recurrencia:
T ( n) 2T (n / 2)
= +1
n n
T ( n / 2)
= +1
n/2
T ( n / 4)
= +1+1
n/4
L
T ( n / n)
= +1+L+1
n/n 123
log 2 n
= log 2 n 28
Mergesort:: Eficiencia
Mergesort
1, n =1
T ( n) =
2T ( n / 2) + n, n > 1
30
Quicksort
void quicksort (double v[], int izda
izda,
, int dcha
dcha)
)
{
int pivote; // Posición del pivote
if (izda
izda<
<dcha
dcha)
) {
Uso:
quicksort (vector, 0, vector.length
vector.length-
-1); 31
Quicksort
Obtención del pivote
Mientras queden elementos mal colocados
con respecto al pivote:
Se recorre el vector, de izquierda a derecha, hasta
encontrar un elemento situado en una posición i tal
que v[i] > p.
Se recorre el vector, de derecha a izquierda, hasta
encontrar otro elemento situado en una posición j
tal que v[j] < p.
Se intercambian los elementos situados en las
casillas i y j (de modo que, ahora, v[i] < p < v[j]).
32
Quicksort
33
Quicksort
int partir (double v[],
int primero
primero,
, int ultimo)
{ if (izda < dcha
dcha)
) {
// Valor del pivote temporal = v[izda
v[izda];
];
double pivote = v[primero]; v[izda
v[izda]
] = v[
v[dcha
dcha];
];
v[dcha
v[dcha]
] = temporal;
// Variable auxiliar dcha--
dcha--;
;
double temporal; izda++;
izda++;
}
int izda = primero+1;
int dcha = ultimo; } while (izda <= dcha
dcha);
);
do { // Pivotear
Pivotear…
… // Colocar el pivote en su sitio
temporal = v[primero];
while ((
((izda
izda<=
<=dcha
dcha)
) v[primero] = v[dcha
v[dcha];
];
&& (v[izda
(v[izda]<=
]<=pivote
pivote))
)) v[dcha
v[dcha]
] = temporal;
izda++;
izda++;
while ((izda
((izda<=
<=dcha
dcha)
) // Posición del pivote
&& (v[dcha
(v[dcha]>pivote))
]>pivote))
return dcha
dcha;
;
dcha--
dcha--;
;
} 34
Quicksort:: Eficiencia
Quicksort
En el peor caso
T(n-1) + c·n ∈ O(n2)
T(n) = T(1) + T(n-
Promedio
1 n −1 2 n −1
T (n) = ∑ [T (n − i ) + T (i )] + cn = ∑ T (i ) + cn ∈ O( n log n)
n i =1 n i =1
35
Heapsort
Algoritmo de ordenación de la familia del algoritmo de
ordenación por selección basado en la construcción de
un árbol parcialmente ordenado (“heap
(“heap”).
”).
Heapsort:: Eficiencia
Heapsort
37
Shellsort
Mejora del algoritmo de ordenación por inserción:
Compara elementos separados por varias posiciones y,
en varias pasadas, de saltos cada vez menores,
ordena el vector (Donald Shell, 1959).
38
Shellsort
Mejora del algoritmo de ordenación por inserción:
Compara elementos separados por varias posiciones y,
en varias pasadas de saltos cada vez menores, ordena
el vector (Donald Shell, 1959).
Otros algoritmos
Radix sort
Histogram sort
Counting sort = ultra sort = math sort
Tally sort
Pigeonhole sort
Bead sort
Timsort
Smoothsort
…
41
Resumen
Burbuja
Selección
42
Resumen
Inserción
Shellsort
43
Resumen
Heapsort
Quicksort
44
Resumen
Timsort:: Mergesort + Ordenación por inserción
Timsort
45