MÉTODOS DE
ORDENACIÓN
CLASE N°3
CLASE N°3
Leissi M. Castañeda León
Que veremos hoy?
1. Introducción
2. Ordenación Interna
Ordenación por intercambio directo (Burbuja)
Ordenación por el método de intercambio directo con señal Ordenación por el método de la sacudida (shaker sort)
Ordenación por el método de la sacudida (shaker sort) Ordenación por inserción directa
Ordenación por el método de inserción binaria Ordenación por selección directa
Ordenación por el método de Shell Ordenación por el método QuickSort
Ordenación por el método HeapSort (montículo)
3. Ordenación Externa
Introducción
ORDENAR significa reagrupar o reorganizar un conjunto
de datos u objetos en un secuencia específica.
Los procesos de ordenación y búsqueda son frecuentes
en nuestra vida. Vivimos en un mundo desarrollado, automatizado, acelerado, donde la información
automatizado, acelerado, donde la información representa un elemento de vital importancia.
Los objetos ordenado aparecen por doquier: Directorio
telefónico, registros de pacientes de un hospital,
Introducción
¿Cuándo es conviente usar un método de
ordenación?
Rpta: Cuando se requiere hacer una cantidad
considerable de búsquedas y es importante el factor tiempo.
tiempo.
Imagine que ocurriría si se deseara encontrar un libro en
una biblioteca con más de 100 000 volúmenes y éstos estuvieran desordenados o registrados en el orden en el que fueron reciibidos.
Ordenación
Formalmente se define ordenación de la siguiente
manera:
Sea A una lista de N elementos:
A1, A2, A3,..., AN
Ordenar significa permutar estos elementos de tal forma
que los mismos queden de acuerdo con una distribución preestablecida.
Ordenación
En el procesamiento de datos, a los métodos de
ordenación se les clasifica en dos grandes categorías, según donde hayan sido almacenados:
Ordenación de arreglos Ordenación de archivos Ordenación de archivos
La primera categoría se denomina también ordenación
interna (dado que los elementos del arreglo se
encuentran en memoria principal) y la segunda
ordenación externa (dado que los elementos se
encuentra en archivos almacenados en dispositivos de almacenamiento secundario, como: discos, cintas, etc.)
Analogía con la vida real:
Se podría decir que para la máquina:
Ordenación Interna: representa lo que para un humano
significa ordenar un conjunto de cartas que se
encuentran todas visibles y extendidas sobre la mesa. encuentran todas visibles y extendidas sobre la mesa.
Ordenación Externa: representa lo que para un humano
2. Ordenación Interna
Ordenación Interna
Se explicarán con arreglos unidimensionales, pero su
uso puede extenderse a otros tipos de arreglos y estructuras de datos.
Dentro de la ordenación interna los métodos se
clasifican en dos tipos: clasifican en dos tipos:
Métodos directos: tienen la característica de que su
implementación es relativamente sencilla y de fácil comprensión, aunque son ineficientes cuando N (el número de elementos del arreglo) es medio o grande.
Métodos logarítmicos: son más complejos que los directos. Su
Ordenación Interna
Notar que la eficiencia entre los distintos métodos va
estar dada por el tiempo de ejecución (depende del número de comparaciones y movimientos).
Los métodos directos más conocidos son:
Los métodos directos más conocidos son:
Ordenación por intercambio Ordenación por inserción Ordenación por selección
2.1. Ordenación por
intercambio directo
Ordenación por intercambio directo
(Burbuja)
Es el más utilizado entre los estudiantes principiantes de
computación por su fácil comprensión y programación.
Se podría señalar que es quizás el método más
ineficiente. ineficiente.
2 formas:
Llevando los elementos menores a la izquierda: Burbuja Menor Llevando los elementos mayores a la derecha: Burbuja Mayor
Al final de las (n-1) pasadas, los elementos del arreglo
estarán ordenados
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
>
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
>
16
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
15 67 08 16 12 44 27 35
15 67 08 12 16 44 27 35
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
18
15 67 08 16 12 44 27 35
15 67 08 12 16 44 27 35
15 67 08 12 16 44 27 35
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
15 67 08 16 12 44 27 35
15 67 08 12 16 44 27 35
15 67 08 12 16 44 27 35
Burbuja Menor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 67 08 16 44 12 27 35
20
15 67 08 16 12 44 27 35
15 67 08 12 16 44 27 35
15 67 08 12 16 44 27 35
15 08 67 12 16 44 27 35
08 15 67 12 16 44 27 35
Burbuja Menor:
primera pasada
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
>
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
08 15 67 12 16 27 44 35
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
>
24
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
26
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 12 67 16 27 44 35
Burbuja Menor:
segunda pasada
08 15 67 12 16 44 27 35
08 15 67 12 16 44 27 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 67 12 16 27 44 35
08 15 12 67 16 27 44 35
08 12 15 67 16 27 44 35
Burbuja Menor:
todas las pasadas
A:
1era:
2da:
3ra:
15 67 08 16 44 27 12 35
08 12 15 67 16 27 44 35
08 15 67 12 16 44 27 35
08 12 15 16 67 27 35 44
4ta:
5ta:
6ta:
7ma:
28
08 12 15 16 27 67 35 44
08 12 15 16 27 35 67 44
08 12 15 16 27 35 44 67
Burbuja Menor: Algoritmo
void burbuja_menor(int A[], int N) {
int aux=0,i=0,j=0; for(i=1;i<N;i++)
for(j=N-1;j>=i;j--)
if(A[j-1]>A[j]) if(A[j-1]>A[j]) {
aux=A[j-1]; A[j-1]=A[j]; A[j]=aux; }
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
>
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
>
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
>
15 08 67 16 44 27 12 35
15 08 16 67 44 27 12 35
34
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 08 67 16 44 27 12 35
15 08 16 67 44 27 12 35
>
15 08 16 67 44 27 12 35
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 08 67 16 44 27 12 35
15 08 16 67 44 27 12 35
36
>
15 08 16 67 44 27 12 35
15 08 16 44 67 27 12 35
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 08 67 16 44 27 12 35
15 08 16 67 44 27 12 35
>
15 08 16 67 44 27 12 35
15 08 16 44 67 27 12 35
15 08 16 44 27 67 12 35
Burbuja Mayor:
primera pasada
15 67 08 16 44 27 12 35
15 67 08 16 44 27 12 35
15 08 67 16 44 27 12 35
15 08 16 67 44 27 12 35
38
>
15 08 16 67 44 27 12 35
15 08 16 44 67 27 12 35
15 08 16 44 27 67 12 35
15 08 16 44 27 12 67 35
Burbuja Mayor:
primera pasada
Burbuja Mayor:
todas las pasadas
A:
1era:
2da:
3ra:
15 67 08 16 44 27 12 35
15 08 16 44 27 12 35 67
08 15 16 27 12 35 44 67
08 15 16 12 27 35 44 67
4ta:
5ta:
6ta:
7ma:
40
08 15 12 16 27 35 44 67
08 12 15 16 27 35 44 67
08 12 15 16 27 35 44 67
Burbuja Mayor: Algoritmo
void burbuja_mayor(int A[], int N) {
int aux=0,i=0,j=0; for(i=N-1;i>0;i--)
for(j=0;j<i;j++)
if(A[j]>A[j+1]) if(A[j]>A[j+1]) {
2.2. Ordenación por
intercambio directo con
señal
Ordenación por intercambio directo
con señal
Es una modificación del método burbuja ya mencionado.
Idea central: utilizar una marca o señal para indicar que
no se ha producido ningún intercambio en una pasada. Es decir se va a comprobar si el arreglo está
Es decir se va a comprobar si el arreglo está
Burbuja con Señal: Algoritmo
2.3. Ordenación por el
método de la sacudida
Ordenación por el método de la
sacudida (shaker sort)
Es una optimización del método de la burbuja.
Idea Básica: mezclar las dos formas en que se puede
realizar el método de la burbuja.
En cada pasada tiene dos etapas: burbuja menor y En cada pasada tiene dos etapas: burbuja menor y
burbuja mayor.
Las sucesivas pasadas trabajan con los elementos del
arreglo comprendidos entre las posiciones almacenadas en variables auxiliares.
Termina cuando en una etapa no se producen
intercambios, o cuando el contenido del extremo izquierdo es mayor que el del derecho.
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Shaker sort:
primera pasada
A:
Primera etapa (burbuja menor: de derecha a izquierda)
A[7] > A[8] (12 > 35) no hay intercambio A[6] > A[7] (27 > 12) si hay intercambio A[5] > A[6] (44 > 12) si hay intercambio
15 67 08 16 44 27 12 35
A[5] > A[6] (44 > 12) si hay intercambio A[4] > A[5] (16 > 12) si hay intercambio A[3] > A[4] (08 > 12) no hay intercambio A[2] > A[3] (67 > 08) si hay intercambio A[1] > A[2] (15 > 08) si hay intercambio
Luego de la primera etapa de la primera pasada queda:
48
08 15 67 12 16 44 27 35
Shaker sort:
primera pasada
A:
Segunda etapa (burbuja mayor: de izquierda a derecha)
A[2] > A[3] (15 > 67) no hay intercambio A[3] > A[4] (67 > 12) si hay intercambio
A[4] > A[5] (67 > 16) si hay intercambio
08 15 67 12 16 44 27 35
A[4] > A[5] (67 > 16) si hay intercambio A[5] > A[6] (67 > 44) si hay intercambio A[6] > A[7] (67 > 27) si hay intercambio A[7] > A[8] (67 > 35) si hay intercambio
Luego de la segunda etapa de la primera pasada queda:
Shaker sort:
segunda pasada
A:
Primera etapa (burbuja menor: de derecha a izquierda)
A[6] > A[7] (27 > 35) no hay intercambio A[5] > A[6] (44 > 27) si hay intercambio
08 15 12 16 44 27 35 67
A[4] > A[5] (16 > 27) no hay intercambio A[3] > A[4] (12 > 16) no hay intercambio A[2] > A[3] (15 > 12) si hay intercambio
Luego de la primera etapa de la segunda pasada queda:
50
08 12 15 16 27 44 35 67
Shaker sort:
segunda pasada
A:
Primera etapa (burbuja menor: de derecha a izquierda)
A[6] > A[7] (27 > 35) no hay intercambio A[5] > A[6] (44 > 27) si hay intercambio
08 15 12 16 44 27 35 67
A[4] > A[5] (16 > 27) no hay intercambio A[3] > A[4] (12 > 16) no hay intercambio A[2] > A[3] (15 > 12) si hay intercambio
Luego de la primera etapa de la segunda pasada queda:
Shaker sort:
segunda pasada
A:
Segunda etapa (burbuja mayor: de izquierda a derecha)
A[3] > A[4] (15 > 16) no hay intercambio
A[4] > A[5] (16 > 27) no hay intercambio
08 12 15 16 27 44 35 67
A[4] > A[5] (16 > 27) no hay intercambio A[5] > A[6] (27 > 44) no hay intercambio A[6] > A[7] (44 > 35) si hay intercambio
Luego de la segunda etapa de la segunda pasada
queda:
52
08 12 15 16 27 35 44 67
Shaker sort:
tercera pasada
Al realizar la primera etapa de la tercera pasada se
Algoritmo Shaker sort
void sacudida(int A[], int N) {
2.4. Ordenación por
inserción directa
Ordenación por Inserción Directa
Lo utilizan generalmente los jugadores de cartas cuando
las ordenan.
Se conoce también como
el método de la baraja.
Idea central: insertar un elemento del arreglo en su
parte izquierda, ya que se encuentra ordenada. Este proceso se repite desde el 2do hasta el n-ésimo
elemento.
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Las comparaciones que se realizan
son:
A:
Primera pasada
A[2] < A[1] (67<15) no hay intercambio
15 67 08 16 44 27 12 35
A[2] < A[1] (67<15) no hay intercambio
Segunda pasada
A[3] < A[2] (08<67) si hay intercambio
A[2] < A[1] (08<15) si hay intercambio
58
15 67 08 16 44 27 12 35
A:
Tercera pasada
A[4] < A[3] (16<67) si hay intercambio
A[3] < A[2] (16<15) no hay intercambio
08 15 67 16 44 27 12 35
A[3] < A[2] (16<15) no hay intercambio
Observe que una vez que se encontró la posición
4ta pasada:
5ta pasada:
08 15 16 44 67 27 12 35
08 15 16 27 44 67 12 35
6ta pasada:
7ma pasada:
60
08 12 15 16 27 44 67 35
Algoritmo Inserción directa
void insercion_directa(int A[], int N) {
int i=0,aux=0,k=0; for(i=1;i<=N-1;i++) {
aux=A[i]; k=i-1; k=i-1;
while((k>=0)&&(aux<A[k])) {
A[k+1]=A[k]; k=k-1;
}
Número de comparaciones
Arreglo ordenado:
Arreglo con orden inverso:
1
min
=
n
−
C
( )
1
2 2max
n
n
n
C
=
−
=
−
Arreglo en forma aleatoria (comparaciones promedio):
62
2
2
max
C
=
=
4
)
2
(
2
2
)
(
)
1
(
2 2−
+
=
−
+
−
=
n
n
n
n
Número de movimientos
Arreglo ordenado:
Arreglo con orden inverso:
0
min
=
M
( )
1
*
)
1
(
...
3
2
1
2n
n
n
n
n
M
=
+
+
+
+
−
=
−
=
−
Arreglo en forma aleatoria (movimientos promedio):
( )
2
2
1
*
)
1
(
...
3
2
1
maxn
n
n
n
n
M
=
+
+
+
+
−
=
−
=
−
Así, por ejemplo:
Si se tiene que ordenar un arreglo de 500 elementos:
Arreglo ordenado:
499 comparaciones 0 movimientos
Arreglo en forma aleatoria (comparaciones promedio): Arreglo en forma aleatoria (comparaciones promedio):
62 624 comparaciones 62 375 movimientos
Arreglo con orden inverso:
124 750 comparaciones 124 750 movimientos
2.5. Ordenación por
inserción binaria
Método de Inserción binaria
Es una “mejora” del método de inserción directa.
La mejora consiste en realizar una búsqueda binaria en
lugar de una búsqueda secuencial, para insertar un elemento en la parte izquierda del arreglo, que ya se elemento en la parte izquierda del arreglo, que ya se encuentra ordenado.
El proceso se repite desde el 2do hasta el n-ésimo
elemento.
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Las comparaciones que se realizan
son:
A:
Primera pasada
A[2] < A[1] (67<15) no hay intercambio
15 67 08 16 44 27 12 35
A[2] < A[1] (67<15) no hay intercambio
Segunda pasada
A[3] < A[1] (08<15) si hay intercambio
68
15 67 08 16 44 27 12 35
A:
Tercera pasada
A[4] < A[2] (16<15) no hay intercambio
A[4] < A[3] (16<67) si hay intercambio
08 15 16 67 44 27 12 35
08 15 67 16 44 27 12 35
Cuarta pasada
A[5] < A[2] (44<15) no hay intercambio
A[5] < A[3] (44<16) no hay intercambio
A[5] < A[4] (44<67) si hay intercambio
A:
Quinta pasada
A[6] < A[3] (27<16) no hay intercambio
A[6] < A[4] (27<44) si hay intercambio
08 15 16 44 67 27 12 35
08 15 16 27 44 67 12 35
Sexta pasada
A[7] < A[3] (12<16) si hay intercambio
A[7] < A[1] (12<08) no hay intercambio
A[7] < A[2] (12<15) si hay intercambio
70
08 15 16 27 44 67 12 35
A:
Séptima pasada
A[8] < A[4] (35<16) no hay intercambio
A[8] < A[6] (35<44) si hay intercambio
A[8] < A[5] (35<27) no hay intercambio
08 12 15 16 27 44 67 35
A[8] < A[5] (35<27) no hay intercambio
Observaciones
El método efectúa el menor número de comparaciones
cuando el arreglo está totalmente desordenado.
El máximo cuando está ordenado (efecto negativo).
En una búsqueda secuencial se necesitan K
comparaciones, entonces en una binaria la mitad. Por lo comparaciones, entonces en una binaria la mitad. Por lo tanto el número de comparaciones promedio es:
72
4
)
(
4
)
1
(
*
2
2
)
1
(
*
2
)
1
(
...
2
3
2
2
2
1
n
n
n
2n
n
n
n
C
=
−
=
−
Algoritmo Inserción Binaria
2.6. Ordenación por
selección directa
Ordenación por Selección directa
Es más eficiente que los mencionados anteriormente.
Su comportamiento es mejor, programación fácil y
comprensible, pero no se recomienda cuando el número de elementos del arreglo es mediano o grande.
Idea Básica: consiste en buscar el menor elemento del
arreglo y colocarlo en la primera posición. Luego se
Se basa en los siguientes principios:
1. Seleccionar el menor elemento del arreglo.
2. Intercambiar dicho elemento con el primero.
Repetir los pasos anteriores con los (n-1), (n-2)
3. Repetir los pasos anteriores con los (n-1), (n-2)
elementos, y así sucesivamente hasta que sólo se quede el elemento mayor.
Ejemplo:
Ordenar:
A: 15 67 08 16 44 27 12 35
Las comparaciones que se realizan son:
A:
Primera pasada:
MENOR ← A[1] (15)
(MENOR < A[2]) (15 < 67) si se cumple la condición (MENOR < A[3]) (15 < 08) no se cumple la condición
15 67 08 16 44 27 12 35
(MENOR < A[3]) (15 < 08) no se cumple la condición
MENOR ← A[1] (8)
(MENOR < A[4]) (08 < 16) si se cumple la condición (MENOR < A[5]) (08 < 44) si se cumple la condición (MENOR < A[6]) (08 < 27) si se cumple la condición (MENOR < A[7]) (08 < 12) si se cumple la condición (MENOR < A[8]) (08 < 35) si se cumple la condición
78
08 67 15 16 44 27 12 35
A:
Segunda pasada:
MENOR ← A[2] (67)
(MENOR < A[3]) (67 < 15) no se cumple la condición
MENOR ← A[3] (15)
(MENOR < A[4]) (15 < 16) si se cumple la condición
08 67 15 16 44 27 12 35
(MENOR < A[4]) (15 < 16) si se cumple la condición (MENOR < A[5]) (15 < 44) si se cumple la condición (MENOR < A[6]) (15 < 27) si se cumple la condición (MENOR < A[7]) (15 < 12) no se cumple la condición
MENOR ← A[7] (12)
A:
3ra pasada:
4ta pasada:
08 12 15 16 44 27 67 35
08 12 15 16 44 27 67 35
08 12 15 16 44 27 67 35
5ta pasada:
6ta pasada:
7ma pasada:
80
08 12 15 16 27 44 67 35
08 12 15 16 27 35 67 44
Numero de comparaciones y
movimientos
Comparaciones:2
)
(
2
)
1
(
*
1
2
...
)
2
(
)
1
(
2n
n
n
n
n
n
C
=
−
+
−
+
+
+
=
−
=
−
Algoritmo de Selección directa
void seleccion_directa(int A[],int N) {
2.7. Ordenación por el
método de Shell
Método Shell
Es una versión mejorada del método de inserción
directa.
Autor: Donald L. Shell, quien lo propuso en 1959.
También se lo conoce como inserción con
incrementos decrecientes. incrementos decrecientes.
Shell propone que las comparaciones entre elementos
se efectúen con saltos de mayor tamaño, pero con
incrementos decrecientes; así los elementos quedarán ordenado más rápidamente.
Veamos el siguiente caso:
Consideremos un arreglo de 16 elementos:
A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10
Se dividirán los elemento en 8 grupos, considerando los elementos
que se encuentran a 8 posiciones de distancia entre sí y se
ordenarán por separado. Quedarán: (A[1],A[9]), (A[2],A[10]) , etc.
Después se dividirán los elementos del arreglo en cuatro grupos,
teniendo en cuenta los elementos que se encuentran a 4 posiciones de distancia entre sí y se los ordenará por separado. Quedarán:
(A[1],A[5],A[9],A[13]), (A[2],A[6],A[10],A[14]), etc.
Ahora de dividirán en 2 grupos. Quedarán:
Veamos:
Primera pasada
A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10
A: 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35 A: 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35
Segunda pasada
A: 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35
A: 15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35
Tercera pasada
A: 15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35
A: 07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67
Cuarta pasada