Está en la página 1de 49

ORDENAMIENTO DE DATOS

Jorge Méndez Sánchez


Eliúh Cuecuecha Hernández
Mauricio Quintero Espinoza
ORDENAMIENTO
El ordenar un grupo de datos significa mover
los datos o sus referencias para que queden en
una secuencia tal que represente un orden, el
cual puede ser numérico, alfabético o incluso
alfanumérico, ascendente o descendente.

El ordenamiento se efectúa con base en


el valor de algún campo en un registro.
ORDENAMIENTO
El propósito principal de un ordenamiento es
el de facilitar las búsquedas de los miembros del
conjunto ordenado.

Recomendable cuando se requiere hacer una


cantidad considerable de búsquedas y es
importante el factor tiempo.
ORDENAMIENTO EFICIENTE
 Contar el # de comparaciones (C)
 Contar el # de movimientos de items (M)
 Estos están en función de el #(n) de items a ser
ordenados.
TIPOS DE ORDENAMIENTO
Los internos:
Los valores a ordenar están
en memoria principal, por lo que se asume que
el tiempo que se requiere para acceder cualquier
elemento sea el mismo (a[1], a[500], etc).
Los externos:
Son aquellos en los que los valores a ordenar
están en memoria secundaria (disco, cinta,
cilindro magnético, etc), por lo que se asume que
el tiempo que se requiere para acceder a
cualquier elemento depende de la última posición
accesada (posición 1, posición 500, etc).
ALGORITMOS DE ORDENAMIENTO
Algoritmos de inserción:
Este método toma cada elemento del arreglo
para ser ordenado y lo compara con los que se
encuentran en posiciones anteriores a la de él
dentro del arreglo. Si resulta que el elemento con
el que se está comparando es mayor que el
elemento a ordenar, se recorre hacia la siguiente
posición superior. Si por el contrario, resulta que
el elemento con el que se está comparando es
menor que el elemento a ordenar, se detiene el
proceso de comparación pues se encontró que el
elemento ya está ordenado.
ALGORITMOS DE ORDENAMIENTO
Algoritmos de inserción:
Entre estos algoritmos se encuentran el de:
 INSERCION DIRECTA

 SHELL SORT

 INSERCION BINARIA.
ORDENACION POR INSERCION
DIRECTA
Algoritmo
1.- Partimos de un arreglo aleatoriamente
ordenado, y marcamos su primer elemento
como parte ordenada, el resto como
desordenada.
2.- Tomamos el primer numero de la parte no
ordenada, y se almacena en una variable temporal.
3.- Comparamos empezando por el final de la parte
ordenada, hasta que se encuentra un elemento
menor.
 4.- Se desplaza una posición a la derecha los
elementos que han resultado mayores que el que
queremos insertar y se coloca el valor de la
variable temporal en el lugar encontrado.
Supóngase que se desea ordenar los siguientes
claves del arreglo A utilizando el método de inserción
directa el cual consiste en insertar un elemento del
arreglo en la parte izquierda del mismo que ya se
encuentra ordenada. Este proceso se repite desde el
segundo hasta el n-esimo elemento.

Ejemplo 1:
A= 15, 67, 08, 16, 44, 27, 12, 35
Comparaciones realizadas:
1ª pasada A[2] < A[1] 67 < 15 No hay intercambio
A= 15, 67, 08, 16, 44, 27, 12, 35
2ª pasada A[3] < A[2] 08 < 67 Si hay intercambio
A= 15, 08, 67, 16, 44, 27, 12, 35
3ª pasada A[4] < A[3] 08 < 15 Si hay intercambio
A= 08, 15, 67, 16, 44, 27, 12, 35
Y así sucesivamente...
INSERCIÓN BINARIA
Para hablar de este método de ordenación es
necesario que esta basado en la búsqueda binaria
o dicotómica.

Diatómico = algo que se divide en dos.


Algoritmo
1.- Hallamos el elemento central del área
comprendida por la parte ordenada más la
posición del elemento a insertar
2.- Comparamos el elemento central con el elemento
central es menor o igual, nos quedamos con la parte
derecha (sin incluir el elemento central) en caso
contrario nos quedamos con la parte izquierda
incluyendo el elemento central.
 3.- Repetimos el mismo proceso sobre el área con
la que nos quedamos, hasta que dicha área sea
nula.
4.- Cuando el área sea nula, tendremos la posición de
inserción.
código
METODO DE SHELL SORT
Es una mejora del método de inserción directa
que se utiliza cuando el número de
elementos a ordenar es grande. El método
se denomina “shell” –en honor de su
inventor Donald shell – y también método
de inserción con incrementos decrecientes.

En el método de clasificación por inserción,


cada elemento se compara con los elementos
contiguos de su izquierda, uno tras otro.
Shell propone que las comparaciones entre
elementos se efecto en con saltos de mayor
tamaño pero con incrementos decrecientes, así,
los elementos quedarán ordenados en el arreglo
más rápidamente.
E l algoritmo Shell Sort mejora el
ordenamiento por inserción comparando elementos
separados por un espacio de varias posiciones. Esto
permite que un elemento haga "pasos más grandes"
hacia su posición esperada. Los pasos múltiples
sobre los datos se hacen con tamaños de espacio
cada vez más pequeños. El último paso del Shell
Sort es un simple ordenamiento por inserción, pero
para entonces, ya está garantizado que los datos del
vector están casi ordenados.
Para ordenar una secuencia de elementos se
procede así: se selecciona una distancia inicial y
se ordenan todos los elementos de acuerdo a esa
distancia, es decir, cada elemento separado de
otro a distancia estará ordenado con respecto a él.
Se disminuye esa distancia progresivamente,
hasta que se tenga distancia 1 y todos los
elementos estén ordenados.
 http://www.youtube.com/watch?v=zUrepw3Dtjs&
feature=related
ALGORITMOS DE ORDENAMIENTO
Algoritmos de intercambio:
En este tipo de algoritmos se toman los
elementos de dos en dos, se comparan y se
INTERCAMBIAN si no están en el orden
adecuado. Este proceso se repite hasta que se ha
analizado todo el conjunto de elementos y ya no
hay intercambios.
Entre estos algoritmos se encuentran el:
 BURBUJA

 QUICK SORT.
MÉTODO BURBUJA
Se recorre el arreglo intercambiando los
elementos adyacentes que estén desordenados. Se
recorre el arreglo tantas veces hasta que ya no
haya cambios. Prácticamente lo que hace es
tomar el elemento mayor y lo va recorriendo de
posición en posición hasta ponerlo en su lugar.
MÉTODO BURBUJA
QUICK SHORT
El algoritmo trabaja de la siguiente forma:
Elegir un elemento de la lista de elementos a ordenar,
al que llamaremos pivote.
Resituar los demás elementos de la lista a cada lado
del pivote, de manera que a un lado queden todos los
menores que él, y al otro los mayores. Los elementos
iguales al pivote pueden ser colocados tanto a su derecha
como a su izquierda, dependiendo de la implementación
deseada. En este momento, el pivote ocupa exactamente el
lugar que le corresponderá en la lista ordenada.
La lista queda separada en dos sublistas, una
formada por los elementos a la izquierda del pivote, y otra
por los elementos a su derecha.
Repetir este proceso de forma recursiva para cada
sublista mientras éstas contengan más de un elemento.
Una vez terminado este proceso todos los elementos
estarán ordenados.
QUICK SHORT
Ejemplo: A: 15,67,08,16,44,27,12,35 Se selecciona A[i] x=15
Primera pasada (DER-IZQ)
 A[8] >= x 35 >= 15 No hay intercambio
 A[7] >= x 12 >= 15 Si hay intercambio
 A: 12,67,08,16,44,27,15,35
 (IZQ-DER) A[2] < = X 67 < = 15 Si hay intercambio
A:12,15,08,16,44,27,67,35
2da. Pasada (DER-IZQ) A[6] >= x 27 >= 15 No hay
intercambio
 A[5] >= x 44 >= 15 No hay intercambio
 A[4] >= x 16 >= 15 No hay intercambio
 A[3] >= x 08 >= 15 Si hay intercambio
 A: 12,08,15,16,44,27,67,35
QUICK SHORT
 X=16 (DER-IZQ) A[8]>=x No hay intercambio A[7]>=x
No hay intercambio
 A[6]>=x No hay intercambio

 A[5]>=x No hay intercambio

 A: 12, 08, 15, 16, 44, 27, 67, 35

 x=44 (DER-IZQ)

 A[8]>= x Si hay intercambio

 A: 12, 08, 15, 16, 35, 27, 67, 44

 (IZQ-DER)

 A[6] < = x No hay intercambio

 A[7] < = x Si hay intercambio 12, 08, 15, 16, 35, 27, 44,
67
QUICK SHORT
 X=35 (DER-IZQ)
 A[8] >= x No hay intercambio

 A[7] >= x No hay intercambio

 A[6] >= x Si hay intercambio

 12, 08, 15, 16, 35, 27, 44, 67

 12, 08, 15, 16, 27, 35, 44, 67

 12,08 x=12 (DER-IZQ)

 A[2]>=x Si hay intercambio

EL VECTOR ORDENADO: 08,12,15,16,27,35,44,67


QUICK SHORT
 void ordena( int vect[], int izq, int der ){
int i = 0, j = 0;
int x = 0, aux = 0;
i = izq;
j = der;
x = vect [ (izq + der) /2 ];
do{
while( (vect[i] < x) && (j <= der) ){
i++;}
while( (x < vect[j]) && (j > izq) ){
j--;}
if( i <= j ){
aux = vect[i];
vect[i] = vect[j];
vect[j] = aux;
i++; j--;
}
}while( i <= j );
if( izq < j )
ordena( vect, izq, j );
if( i < der )
ordena( vect, i, der );
}
ALGORITMOS DE ORDENAMIENTO
Algoritmos de selección:
En este tipo de algoritmos se SELECCIONA
o se busca el elemento más pequeño (o más
grande) de todo el conjunto de elementos y se
coloca en su posición adecuada. Este proceso se
repite para el resto de los elementos hasta que
todos son analizados.
Entre estos algoritmos se encuentra el de
SELECCION DIRECTA.
SELECCIÓN DIRECTA
1ª pasada: buscamos entre los últimos n (es decir, 5)
elementos el menor de todos, y lo intercambiaremos con la
primera posición.
45, 52, 21, 37, 49 → Para buscar el menor, necesitaremos
un bucle for que recorra los n últimos elementos.
45, 52, 21, 37, 49 → El menor es el 21, colocado en tercera
posición.
45, 52, 21, 37, 49 → Lo intercambiamos con el de la primera
posición.
21, 52, 45, 37, 49 → Ya tenemos uno en orden. Nos quedan
los n-1 últimos.
SELECCIÓN DIRECTA
2ª pasada: buscamos entre los últimos n-1 (es decir, 4)
elementos el menor de todos, y lo intercambiaremos con
la segunda posición.
21, 52, 45, 37, 49 → Recorremos los cuatro últimos y el
menor es el 37.
21, 37, 45, 52, 49 → Lo intercambiamos con la segunda
posición y ya hay dos en orden.
3ª pasada: buscamos entre los últimos n-2 (es decir, 3)
elementos el menor de todos, y lo intercambiaremos con
la tercera posición.
21, 37, 45, 52, 49 → El menor es el 45, en tercera
posición.
21, 37, 45, 52, 49 → El 45 ya estaba en 3ª posición, así
que al intercambiarlo con él mismo, se queda donde está.
Ya tenemos tres en orden.
SELECCIÓN DIRECTA
4ª y última pasada: buscamos entre los últimos n-
3 (es decir, 2) elementos el menor de todos, y lo
intercambiaremos con la cuarta posición.
21, 37, 45, 52, 49 → El menor es el 49, en quinta
posición.
21, 37, 45, 49, 52 → Lo intercambiamos con la
cuarta posición. Ya hay cuatro en orden.
21, 37, 45, 49, 52 → El último está
necesariamente en orden también.
SELECCIÓN DIRECTA
para i=1 hasta n-1
minimo = i;
para j=i+1 hasta n
si lista[j] < lista[minimo] entonces
minimo = j /* (!) */
fin si
fin para
intercambiar(lista[i], lista[minimo])
fin para
ALGORITMOS DE ORDENAMIENTO
Algoritmos de enumeración:
En este tipo de algoritmos cada elemento es
comparado contra los demás. En la comparación
se cuenta cuántos elementos son más pequeños
que el elemento que se está analizando,
generando así una ENUMERACION. El número
generado para cada elemento indicará su
posición. Ejemplo : Hashing
HASHING
Hash: se refiere a una función o método para
generar claves o llaves que representen de manera
casi unívoca a un documento, registro, archivo, etc.,
resumir o identificar un dato a través de la
probabilidad, utilizando una función hash o
algoritmo hash.
Consiste en asignar a cada elemento
un índice mediante una transformación
del elemento. Esta correspondencia se
realiza mediante una función de
conversión, llamada función hash.

Correspondencia más sencilla es la


identidad, esto es, al número 0 se le
asigna el índice 0, al elemento 1 el índice
1, y así sucesivamente. Pero si los
números a almacenar son demasiado
grandes esta función es inservible.
Por ejemplo, se quiere guardar en un array la
información de los 1000 usuarios de una empresa, y
se elige el número de DNI como elemento
identificativo. Es inviable hacer un array de
100.000.000 elementos, sobre todo porque se
desaprovecha demasiado espacio. Por eso, se realiza
una transformación al número de DNI para que nos
de un número menor, por ejemplo coger las 3
últimas cifras para guardar a los empleados en un
array de 1000 elementos. Para buscar a uno de
ellos, bastaría con realizar la transformación a su
DNI y ver si está o no en el array.
1.- Restas sucesivas:
Esta función se emplea con claves numéricas entre las que
existen huecos de tamaño conocido, obteniéndose
direcciones consecutivas. Un ejemplo serian los
alumnos de ingeniería en sistemas que entraron en el
año 2005 sus números de control son consecutivos y
esta definido el numero de alumnos.
05210800 -05210800»» 0
05210801 -05210800»» 1
05210802 -05210800»» 2

05210899 -05210800»» 99
2.- Aritmética modular:
El índice de un número es resto de la división de ese número entre un
número N prefijado, preferentemente primo. Los números se
guardarán en las direcciones de memoria de 0 a N-1. Este método tiene
el problema de que dos o más elementos pueden producir el mismo
residuo y un índice puede ser señalado por varios elementos. A este
fenómeno se le llama colisión. Si el número N es el 7, los números
siguientes quedan transformados en:
1679 »> 6
4567 »> 3
8471 »> 1
0435 »> 1
5033 »> 0
Mientras mas grande sea número de elementos es mejor escoger un número
primo mayor para seccionar el arreglo en más partes. El número elegido
da el número de partes en que se secciona el arreglo, y las cada sección
esta compuesta por todos los elementos que arrojen el mismo residuo, y
mientras mas pequeñas sean las secciones la búsqueda se agilizara mas
que es lo que nos interesa.
3.- Mitad del cuadrado:
Consiste en elevar al cuadrado la clave y coger
las cifras centrales. Este método también presenta
problemas de colisión.
709^2=502681 –> 26
456^2=207936 –> 79
105^2=11025 –> 10
879^2=772641 –> 26
619^2=383161 –> 31
Nota: en caso de que la cifra resultante sea impar se
toma el valor número y el anterior.
5.- Truncamiento:
Consiste en ignorar parte del número y utilizar los
elementos restantes como índice. También se
produce colisión. Por ejemplo, si un
número de 7 cifras se debe ordenar en un arreglo
de elementos, se pueden tomar el segundo, el cuarto
y el sexto para formar un nuevo número:
5700931 »> 703
3498610 »> 481
0056241 »> 064
9134720 »> 142
5174829 »> 142
5.- Plegamiento:
Consiste en dividir el número en diferentes partes, y
operar con ellas (normalmente con suma o
multiplicación). También se produce colisión. Por ejemplo,
si dividimos el número de 7cifras en 2, 2 y 3 cifras y se
suman, dará otro número de tres cifras (y si no, se toman
las tres últimas cifras): 5700931 »> 57 + 00 + 931 = 988
3498610 »> 34 + 98 + 610 = 742
0056241 »> 00 + 56 + 241 = 297
9134720 »> 91 + 34 + 720 = 845
5174929 »> 51 + 74 + 929 = 1054
Nota: Estas solo son sugerencias y que con cada problema
se pude implementar una nueva función hash que incluso
tu puedes inventar o formular.

También podría gustarte