Title: Ordenaci
1Ordenación, Clasificación
- Introducción
- Algoritmos
- Complejidad
2Introducción
- Ordenación o clasificación es el proceso de
reordenar un conjunto de objetos en un orden
específico. El propósito de la ordenación es
facilitar la búsqueda de elementos en el conjunto
ordenado. - Existen muchos algoritmos de ordenación, siendo
la diferencia entre ellos las ventajas de unos
sobre otros en la eficiencia en tiempo de
ejecución.
3Introducción
- Los métodos de ordenación se pueden clasificar en
dos categorías - ordenación de ficheros y
- ordenación de arrays.
- También suele llamarse ordenamiento externo e
interno, debido a que los ficheros se guardan en
la memoria externa (lenta) mientras que los
arrays se almacenan en la memoria rápida del
ordenador (interna). En esta sección sólo se
aborda el ordenamiento interno.
4Introducción
- El problema del ordenamiento puede establecerse
mediante la siguiente ación - Dados los elementos
- Ordenar consiste en permutar esos elementos en
un orden - tal que dada una función de ordenamiento f
5Introducción
- Normalmente, la función de ordenamiento no es
evaluada de acuerdo a una regla de computación
determinada, pero se guarda como un componente
explícito (campo) de cada item (elemento). El
valor de ese campo se llama la llave del item. - Un método de ordenamiento es estable si el orden
relativo de elementos con igual llave permanece
inalterado por el proceso de ordenamiento. - Se entiende que los métodos de ordenamiento
buscan un uso eficiente de la memoria por lo que
las permutaciones de elementos se hará in situ,
es decir, usando el mismo contenedor original.
6Introducción
- En lo que sigue se considera que la estructura
lineal (array, lista, vector o secuencia) a
ordenar se representa por un array de objetos
(números enteros) - int a new intMAX
- siendo MAX el número máximo de elementos del
array. El orden de los elementos después de la
ordenación se considera ascendente.
7Algoritmo burbuja
- Es un método caracterizado por la comparación e
intercambio de pares de elementos hasta que todos
los elementos estén ordenados. - En cada iteración se coloca el elemento más
pequeño (orden ascendente) en su lugar correcto,
cambiándose además la posición de los demás
elementos del array.
8Algoritmo burbuja
9Algoritmo burbuja
10Algoritmo burbuja
11Algoritmo burbuja
12Algoritmo burbuja
13Algoritmo burbuja
- for(inigt0i--)
- for(j0jlti-1j)
- if (aj gt aj1)
-
- taj
- aj aj1
- aj1t
- ninterc
-
14Algoritmo sacudida (shakesort)
- Es una mejora del algoritmo de burbuja en el que
se registra la ocurrencia de un intercambio y el
índice del último intercambio y se alterna la
dirección de las pasadas consecutivas. Con ello
una burbuja liviana en el lado pesado y una
pesada en el lado liviano quedarán en orden en
una pasada simple.
15Algoritmo sacudida (shakesort)
lk1 for(jl jltr j) if
(aj-1gtaj) taj-1 aj-1
aj ajt kj ninterc
rk-1 while (lltr)
- l1 rn-1 kn-1
- do
-
- for(jr jgtl j--)
- if (aj-1gtaj)
-
- taj-1
- aj-1 aj
- ajt
- kj
- ninterc
-
-
16Algoritmo inserción
- Este método es usado por los jugadores de cartas.
Los elementos están divididos conceptualmente en
una secuencia destino y una secuencia fuente .
En cada paso, comenzando con i2 e incrementando
i en uno, el elemento i-ésimo de la secuencia
fuente se toma y se transfiere a la secuencia
destino insertándolo en el lugar adecuado. - En otras palabras, en el i-ésimo paso insertamos
el i-ésimo elemento ai en su lugar correcto
entre a1, a2,., ai-1, que fueron colocados
en orden previamente.
17Algoritmo inserción
18Algoritmo inserción
19Algoritmo inserción
20Algoritmo inserción
21Algoritmo inserción
22Algoritmo inserción
23Algoritmo inserción
24Algoritmo inserción
25Algoritmo inserción
- for(i1iltni)
-
- ji-1
- tai
- while (jgt0 tltaj)
-
- aj1 aj
- jj-1
-
- aj1t
-
26Algoritmo selección
- En éste método, en el i-ésimo paso seleccionamos
el elemento con la llave de menor valor, entre
ai,, an y lo intercambiamos con ai. Como
resultado, después de i pasadas, el i-ésimo
elemento menor ocupará a1,, ai en el lugar
ordenado.
27Algoritmo selección
28Algoritmo selección
29Algoritmo selección
30Algoritmo selección
31Algoritmo selección
32Algoritmo selección
33Algoritmo selección
34Algoritmo selección
35Algoritmo selección
- for(i0iltn-1i)
-
- ki
- tai
- for (ji1 jltn j)
-
- if (aj lt t)
-
- t aj
- kj
-
- ak ai
- ai t
-
-
36Algoritmo rápido (Quicksort)
- La ordenación rápida se basa en el hecho que los
intercambios deben ser realizados preferentemente
sobre distancias grandes. - El algoritmo a seguir es el mismo que se aplica
cuando se quiere ordenar un gran montón de
exámenes - Seleccionar un valor de división (L por ejemplo)
y dividir el montón en dos pilas, A-L y M-Z.
Después se toma la primera pila y se subdivide en
dos, A-F y G-L por ejemplo. A su vez la pila A-F
puede subdividirse en A-C y D-F. Este proceso
continúa hasta que las pilas sean suficientemente
pequeñas para ordenarlas fácilmente. El mismo
proceso se aplica a la otra pila.
37Algoritmo rápido (Quicksort)
- En este caso se toma un elemento x del array (el
del medio por ejemplo), se busca en el array
desde la izquierda hasta que gtx, lo mismo se hace
desde la derecha hasta encontrar ltx. - Después se intercambia esos elementos y se
continúa ese proceso hasta que los índices se
encuentren en la mitad del array. Se aplica el
mismo proceso para la porción izquierda del array
entre el extremo izquierdo y el índice derecho y
para la porción derecha entre el extremo derecho
y el último índice izquierdo.
38Algoritmo rápido (Quicksort)
- Descripción del algoritmo
- 1) Dividir Si la secuencia S tiene 2 o más
elementos, seleccionar un elemento x de S como
pivote. Cualquier elemento arbitrario, como el
último, puede servir. Elimiar los elementos de S
dividiéndolos en 3 secuencias - L, contiene los elementos de S menores que x
- E, contiene los elementos de S iguales a x
- G, contiene los elementos de S mayores que x
- 2) Recursión De forma recursiva ordenar L y G
- 3) Vencer Finalmente, colocar nuevamente los
elementos en S en orden, primero insertar los
elementos de L, después E, y los elementos de G.
39Idea de Quick Sort
- 1) Selección tomar un elemento
- 2) Dividir reordenar los elementos tal que x va
a su posición final E - 3) Recursión y Vencer ordenar recursivamente
-
40Arbol Quicksort
41Arbol Quicksort
42Arbol Quicksort
43Arbol Quicksort
44Arbol Quicksort
45Arbol Quicksort
46Arbol Quicksort
47Arbol Quicksort
48Arbol Quicksort
49Arbol Quicksort
50Arbol Quicksort
51Arbol Quicksort
52... Arbol Quicksort (final)
53Quicksort In-Place
Paso Dividir l recorre la secuencia desde la
izquierda, y r desde la derecha
Se realiza un intercambio cuando l está en un
elemento mayor que el pivote y r está en uno
menor al pivote.
54In Place Quick Sort (contd.)
Un intercambio con el pivote completa el paso
dividir cuando r lt l
55Algoritmo rápido (Quicksort)
for (iizq1iltderi) if (ai lt aizq)
tmp ault ault ai
aitmp tmp aizq aizq ault
aulttmp qsort(izq,ult-1,a)
qsort(ult1,der,a)
- void qsort(int izq, int der, int a)
-
- int i, ult, m, tmp
- if (izq gt der)
- return
- tmp aizq
- m (izqder)/2
- aizq am
- amtmp
- ultizq
56Ordenación directa por base (radix sort)
- A diferencia de otros métodos, radix sort
considera la estructura de las llaves. - Se asume que las llaves están representadas en un
sistema de numeración M (Mradix), e.g., si M2,
las llaves están representadas en binario. - Toma ventaja de la posición de cada dígito
individual en la clave. Hay dos versiones de la
ordenación radix MSD (most significant digit),
LSD (least significant digit). - La ordenación se realiza comparando los bits en
cada posición.
57Ejemplo Radix sort
- Conjunto a ordenar 33, 60, 5, 15, 25, 12, 45,
70, 35, 7 - frente
cola - cola_digitos0 60
70 - cola_digitos1
- cola_digitos2 12
- cola_digitos3 33
- cola_digitos4
- cola_digitos5 5 15 25 45
35 - cola_digitos6
- cola_digitos7 7
- cola_digitos8
- cola_digitos9
58Ejemplo Radix sort
- Conjunto a ordenar 33, 60, 5, 15, 25, 12, 45,
70, 35, 7 - frente
cola - cola_digitos0 05
07 - cola_digitos1 12
- cola_digitos2 25
- cola_digitos3 33 35
- cola_digitos4
- cola_digitos5 45
- cola_digitos6 60
- cola_digitos7 70
- cola_digitos8
- cola_digitos9
59Radix sort directo
- Se examinan los bits de derecha a izquierda
- for k0 to b-1
- ordenar el array de forma estable
- tomando solo el bit k
60Radix sort en enteros
- La ordenación resultante es estable
61Análisis de Tiempo de Ejecución
- Los algoritmos de burbuja, inserción, selección
corren en O(n2). - El algoritmo quicksort, montones corren en
O(nlogn) - El algoritmo radix sort es O(n)