que pone elementos de una lista o un vector en una secuencia dada por una relacin de
orden, es decir, el resultado de salida ha de ser una permutacin o reordenamiento de
la entrada que satisfaga la relacin de orden dada. Las relaciones de orden ms usadas son
el orden numrico y el orden lexicogrfico. Ordenamientos eficientes son importantes para
optimizar el uso de otros algoritmos (como los de bsqueda y fusin) que requieren listas
ordenadas para una ejecucin rpida. Tambin es til para poner datos en forma cannica y
para generar resultados legibles por humanos.
Desde los comienzos de la computacin, el problema del ordenamiento ha atrado gran
cantidad de investigacin, tal vez debido a la complejidad de resolverlo eficientemente a
pesar de su planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde
1956.1 Aunque muchos puedan considerarlo un problema resuelto, nuevos y tiles
algoritmos de ordenamiento se siguen inventado hasta el da de hoy (por ejemplo, el
ordenamiento de biblioteca se public por primera vez en el 2004). Los algoritmos de
ordenamiento son comunes en las clases introductorias a la computacin, donde la
abundancia de algoritmos para el problema proporciona una gentil introduccin a la
variedad de conceptos ncleo de los algoritmos, como notacin de O mayscula, algoritmos
divide y vencers, estructuras de datos, anlisis de los casos peor, mejor, y promedio, y
lmites inferiores.
Clasificacin
Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:
Estabilidad
Los algoritmos de ordenamiento estable mantienen un relativo preorden total. Esto significa
que un algoritmo es estable solo cuando hay dos registros R y S con la misma clave y con R
apareciendo antes que S en la lista original.
Cuando elementos iguales (indistinguibles entre s), como nmeros enteros, o ms
generalmente, cualquier tipo de dato en donde el elemento entero es la clave, la estabilidad
no es un problema. De todas formas, se asume que los siguientes pares de nmeros estn
por ser ordenados por su primer componente:
(4, 1)
(3, 7)
(3, 1)
(5, 6)
En este caso, dos resultados diferentes son posibles, uno de los cuales mantiene un orden
relativo de registros con claves iguales, y una en la que no:
(3, 7)
(3, 1)
(3, 1)
(3, 7)
(4, 1)
(4, 1)
(5, 6)
(5, 6)
(orden mantenido)
(orden cambiado)
Los algoritmos de ordenamiento inestable pueden cambiar el orden relativo de registros con
claves iguales, pero los algoritmos estables nunca lo hacen. Los algoritmos inestables
pueden ser implementados especialmente para ser estables. Una forma de hacerlo es
extender artificialmente el cotejamiento de claves, para que las comparaciones entre dos
objetos con claves iguales sean decididas usando el orden de las entradas original.
Recordar este orden entre dos objetos con claves iguales es una solucin poco prctica, ya
que generalmente acarrea tener almacenamiento adicional.
Ordenar segn una clave primaria, secundaria, terciara, etc., puede ser realizado utilizando
cualquier mtodo de ordenamiento, tomando todas las claves en consideracin (en otras
palabras, usando una sola clave compuesta). Si un mtodo de ordenamiento es estable, es
posible ordenar mltiples tems, cada vez con una clave distinta. En este caso, las claves
necesitan estar aplicadas en orden de aumentar la prioridad.
Ejemplo: ordenar pares de nmeros, usando ambos valores
(4, 1)
(4, 1)
valor)
(3, 1)
valor)
(3, 7)
(3, 1)
(3, 1)
(4, 6)
(4, 6) (original)
(3, 7) (despus de ser ordenado por el segundo
(3, 7)
(4, 1)
(3, 1)
(4, 1)
(4, 1)
(4, 6)
perturbado)
Nombre
original
Complejidad
Memoria Mtodo
O(n)
O(1)
Intercambio
Ordenamiento de burbuja
Cocktail sort
bidireccional
O(n)
O(1)
Intercambio
Ordenamiento por
insercin
Insertion sort
O(n)
O(1)
Insercin
Ordenamiento por
casilleros
Bucket sort
O(n)
O(n)
No
comparativo
Ordenamiento por
cuentas
Counting sort
O(n+k)
O(n+k)
No
comparativo
Ordenamiento por
mezcla
Merge sort
O(n log n)
O(n)
Mezcla
O(n)
Insercin
Ordenamiento Radix
O(k)
Radix sort
O(nk)
O(n)
Distribution
sort
O(n) versin
recursiva
O(n)
Gnome sort
O(n)
No
comparativo
Inestables
Nombre traducido
Nombre
original
Complejidad
Memoria Mtodo
Ordenamiento Shell
Shell sort
O(n1.25)
O(1)
Insercin
Comb sort
O(n log n)
O(1)
Intercambio
Ordenamiento por
seleccin
Selection sort
O(n)
O(1)
Seleccin
Ordenamiento por
montculos
Heapsort
O(n log n)
O(1)
Seleccin
Smoothsort
O(n log n)
O(1)
Seleccin
Quicksort
Ordenamiento rpido
Nombre
original
Complejidad
Bogosort
O(n), excepto en
Pancake sorting mquinas de Von
Neumann
Randomsort
Memoria Mtodo
Fin si
Fin para
Fin para
Fin
ORDENAMIENTO DIRECTO CON SEAL
Algoritmo que usa el principio de ordenamiento del mtodo de la burbuja, usando una seal
para saber si en cada pasada hubo intercambios. Arreglo A de N elementos enteros.
Burbujaconseal(A, N)
Inicio
Declarar i,j,aux:entero
Declarar band:booleano
i1
Band FALSO
Mientras Que (i<= N-1) y (band = FALSO) haga
Band VERDADERO
Para j 1 hasta N-i haga
Si (A[j]>A[j+1]) entonces
Aux A[j]
A[j] A[j+1]
A[j+1] aux
Band FALSO
Fin si
Fin para
Fin MQ
Fin
ORDENAMIENTO POR EL MTODO DE LA SACUDIDA (SHAKER SORT)
Este mtodo es una optimizacin del mtodo de la burbuja. Consiste en mezclar las dos
formas como se puede realizar el mtodo de ordenamiento directo. En cada pasada hay dos
etapas, el la primera etapa se trasladan los elementos ms pequeos hacia la izquierda
almacenando en una variable el ltimo elemento intercambiado. En la segunda etapa, se
trasladan los elementos ms grandes hacia la parte derecha del arreglo almacenando en otra
variable la posicin del ltimo elemento intercambiado.
Algoritmo que ordena los elementos del arreglo A, de N elementos, por el mtodo de la
sacudida.
Shakersort(A,N)
Inicio
Declarar i, izq, der, k, aux: entero
izq 2
der N
kN
Repetir
Para i der hasta izq inc (-1) haga
Si (A[i-1]>A[i]) entonces
Aux A[i-1]
A[i-1] A[i]
A[i] aux
ki
Fin si
Fin para
Izq k + 1
Para i izq hasta der haga
Si (A[i-1] > A[i]) entonces
Aux A[i-1]
A[i-1] A[i]
A[i] Aux
ki
Fin si
Fin para
Der k-1
Hasta que izq>der
Fin
METODO DE ORDENAMIENTO POR INSERCIN DIRECTA
El objetivo de este mtodo es copiar la forma como los jugadores de cartas ordenan la
baraja en una mano. El objetivo de este mtodo es insertar un elemento en la parte
izquierda del arreglo que ya se encuentra ordenada. El proceso se repite desde el segundo
hasta el n-esimo elemento.
Algoritmo que ordena los elementos del arreglo usando el mtodo de insercin directa.
Arreglo A de N elementos.
insercion(A,N)
Inicio
Declarar i, aux, k: entero
Para i 2 hasta N haga
Aux A[i]
k i-1
Mientras Que ((k>=1) y (aux<A[k])) haga
A[k+1] A[k]
k k -1
Fin MQ
A[k+1] aux
Fin para
Fin
ORDENAMIENTO POR MTODO DE INSERCIN BINARIA
Es una mejora del mtodo de insercin directa, ya que se hace una bsqueda binaria en
lugar de una bsqueda secuencial para insertar el elemento a la izquierda del arreglo, que ya
se encuentra ordenado. Y el proceso se repite hasta el n-esimo elemento.
Algoritmo que ordena los elementos del arreglo usando el mtodo de insercin binara.
Arreglo A de N elementos.
insercionbinaria(A,N)
Inicio
Declarar i, aux, izq, der, m, j: entero
Para i 2 hasta N haga
Aux A[i]
Izq 1
Der i-1
Mientras Que (izq<=der) haga
m parteentera((izq+der)/2)
Si (aux <= A[m]) entonces
Der m-1
Sino
Izq m+1
Fin si
Fin MQ
j i-1
Mientras Que (j>=izq) haga
A[j+1] A[j]
j j-1
Fin MQ
A[izq] aux
Fin para
Fin
ORDENAMIENTO POR SELECCIN DIRECTA
La idea de este algoritmo es buscar el menor elemento del arreglo y colocarlo en la primera
posicin, luego se busca el segundo elemento ms pequeo del arreglo y se coloca en la
segunda posicin y as. El algoritmo se basa en:
1. Seleccionar el menor elemento del arreglo.
2. Intercambiar dicho elemento con el primero.
3. Repetir los pasos anteriores con los (n-1), (n-2)... elementos y as sucesivamente
hasta que solo quede el elemento mayor.
Algoritmo que ordena los elementos de un arreglo usando el mtodo de seleccin directa. A
arreglo de N elementos.
seleccion(A,N)
Inicio
Declarar i, menor, k, j: entero
Para i 1 hasta N-1 haga
Menor A[i]
ki
Para j i+1 hasta N haga
Si (A[j]<menor) entonces
Menor A[j]
kj
Fin si
Fin para
A[k] A[i]
A[i] menor
Fin para
Fin
comp.
Mov
comp.
Mov
comp.
Mov
Fin si
i i+1
Fin MQ
Fin MQ
Fin MQ
Fin
ORDENAMIENTO POR EL MTODO DE QUICKSORT (MTODO RPIDO DE
ORDENACIN POR PARTICIN)
Este algoritmo es el mas eficiente y veloz de los mtodos de ordenacin interna. La idea
central del algoritmo es:
1. Se toma un elemento X de una posicin cualquiera del arreglo
2. Se trata de ubicar a X en la posicin de correcta del arreglo, de tal forma que todos
los elementos que se encuentran a su izquierda sean menores o iguales a X y todos
los elementos que se encuentran a su derecha sean mayores o iguales a X.
3. Se repiten los pasos anteriores, pero con los conjuntos de datos que se encuentran a
la izquierda y a la derecha de la posicin correcta de X en el arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su posicin
correcta en el arreglo.
El paso 3 se puede hacer de forma iterativa o recursiva. En este ejemplo, se har de forma
iterativa, dejando el mtodo recursivo para ms adelante en el curso.
Se necesitan dos algoritmos. Quicksortitera y reduceitera.
Algoritmo que ordena los elementos de un arreglo A de N elementos, usando el mtodo
Quicksort iterativo.
Quicksortitera(A, N)
Inicio
Declarar top, ini, fin, pos: entero
Pilamayor: Arreglo[1..MAX] de entero
Pilamenor: Arreglo[1..MAX] de entero
Top 1
Pilamenor[top] 1
Pilamayor[top] N
Mientras Que (top>0) haga
Ini pilamenor[top]
Fin pilamayor[top]
Top top-1
Pos Reduceitera(ini, fin)
Si (ini<(pos-1)) entonces
Top top+1
Pilamenor[top] ini
Pilamayor[top] pos-1
Fin si
Si (fin>(pos+1)) entonces
Top top+1
Pilamenor[top] pos+1
Pilamayor[top] fin
Fin si
Fin MQ
Fin
Reduceitera(INI, FIN)
/* INI y FIN representa las posiciones de los extremos izquierdo y
derecho respectivamente del conjunto de elementos a evaluar. En POS es
una variable donde se almacenar el resultado de este algoritmo */
Inicio
Declarar izq, der, aux, pos: entero
Declarar band: booleano
Izq ini
Der fin
Pos ini
Band VERDADERO
Mientras Que (band=VERDADERO) haga
Mientras Que ((A[pos]<=A[der]) y (pos<>der)) haga
der der-1
Fin MQ
Si (Pos=der) entonces
Band FALSO
Sino
Aux A[pos]
A[pos] A[der]
A[der] aux
Pos der
Mientras Que ((A[pos]>=A[izq])y(pos<>izq)) haga
Izq izq+1
Fin MQ
Si (pos=izq) entonces
Band Falso
Sino
Aux A[pos]
A[pos] A[izq]
A[izq] aux
Pos izq
Fin si
Fin si
Fin MQ
Retornar Pos
Fin