Está en la página 1de 32

Algoritmos de

ordenamiento
Objetivos
 Analizar el desempeño de diferentes
algoritmos empleados en el
ordenamiento de números o cadenas
de números o caracteres
 Determinar que algoritmo es más
eficiente para un problema particular
dado.
Ordenamientos
 Dada una secuencia de n datos a1,
a2,…,an tomados de un conjunto con
orden lineal , el ordenamiento
consiste en encontrar una
permutación  de los elementos que
asocie la secuencia dada en una
secuencia no decreciente:
a(1), a(2),…,a(n) tal que a(i)  a(i+1) 1 i<n
Ordenamientos
 Para la entrada 2,5,4,1,3 la permutación
que produce el ordenamiento es: (1)=2,
(2)=5, (3)=4, (4)=1, y (5)=3. Así:
a(4), a(1), a(5), a(3), a(2)
1 2  3 4 5
 Para una secuencia de n elementos, el
número de permutaciones considerando n
datos elementos es n!
¿Porqué?
 Uso frecuente
 Facilidad de uso de los datos
 Diseño de algoritmos
(preprocesamiento)
– Algoritmos Avaros
– Mínimo y Máximo
– Mediana
Clasificación
 Internos. Los datos  Datos con estructura.
reciben en Aprovechan la
estructura de los
memoria principal
datos a ordenar
y son pocos
 Datos sin estructura.
 Externos. Los Se asume que los
datos residen en datos no tienen
memoria ninguna estructura.
secundaria
Ordenamiento por
comparación
 Es necesario realizar comparaciones
entre elementos
 Ejemplos:
– Ordenamiento por selección
– Ordenamiento por inserción
– MergeSort
– Heapsort
– Quicksort
Ordenamiento por selección
Seleccionar repetidamente el elemento mas
pequeño que queda, intercambiandolo con
el primero:
ASORTINGEXAMPLE
ASORTINGEXAMPLE
ASORTINGEXAMPLE
AAORTINGEXSMPLE
AAERTINGOXSMPLE … ETC
Ordenamiento por selección
1. for(i:=1; i<=(n-1); i++) {
2. small=i;
3. for(j:=i+1; j<=n; j++)
4. if(A[j]<A[small])
5. small=j;
6. temp=A[small];
7. A[small]=A[i];
8. A[i]=temp;
}
Ordenamiento por selección
El método es simple, fuerza bruta
N-1)+(N-2)+ …2+1=N2/2 comparaciones,
N intercambios
Como cada record se mueve a lo mas
una vez, tiene aplicaciones para
ordenar archivos con records grandes y
campos de ordenamiento pequeños
Ordenamiento por inserción
Este es el que se usa en las cartas: el elemento
a ser considerado se inserta en el lugar
apropiado en una secuencia ordenada. Hay
que mover a la derecha a veces muchos
elementos.
ASORTINGEXAMPLE
ASO
AOSR
AORST
AORSTI ...ETC
Ordenamiento por inserción
1. for j = 2 to length[A] {
2. Key = A[j];
3. i = j-1;
4. while i > 0 y A[i] > Key {
5. A[i+1]=A[i];
6. i=i-1;
7. }
8. A[i+1] = Key;
}
Ordenamiento por inserción
Este ordenamiento usa N2/4 comparaciones y
N2/8 intercambios en promedio, el doble en el
peor caso, pero es lineal en archivos casi
ordenados
Árboles
 Un árbol es un grafo dirigido acíclico
que satisface las siguientes
propiedades:
 Existe exactamente un vértice, llamado
raíz, al que no llega ningún arco.
 Cada vértice excepto la raíz tiene
exactamente un arco entrante.
 Existe un camino único de la raíz a
cada vértice.
Árboles
 La profundidad de v es la
longitud del camino de la raíz
a v.
 La altura de v es la longitud
del camino más largo de v a
una hoja.
 La altura de un árbol es la
altura de la raíz.
 El nivel de v en un árbol es
la altura del árbol menos la
profundidad de v.
Árbol de decisión
 Consideración de las instrucciones de
ramificación (condicionales).

 En los ordenamientos, es razonable


considerar un modelo en el cual todos
los pasos de progresión sean
ramificaciones de dos vías basadas en
una comparación entre dos cantidades.
Árbol de decisión
 La representación para un programa de
ramificaciones es un árbol binario llamado
árbol de decisión. Cada vértice interior
representa una decisión. La prueba
representada por la raíz se hace primero, y el
control pasa, dependiendo del resultado, a
uno de sus hijos. En general, el control
continúa pasando de un vértice a uno de sus
hijos hasta que se alcanza una hoja (salida).
Árbol de decisión
 Lema. Un árbol binario de altura h tiene a lo
más 2h hojas.
 Teorema. Un árbol para ordenar n elementos
debe tener al menos n! hojas
 Teorema. Un árbol de decisión para ordenar n
datos tiene altura de al menos log n!
 Corolario. Cualquier algoritmo de
ordenamiento por comparaciones requiere al
menos de cn log n comparaciones para
ordenar n datos para alguna c>0 y n grande.
MergeSort

Mergesort es el caso típico de divide y


conquista y tiene la recurrencia
MN=2MN/2+N i.e. NlogN aun en el peor
caso, pero requiere espacio extra. El
secreto esta en que el merge de dos
secuencias ordenadas se puede hacer en
tiempo lineal.
MergeSort

El MERGE:

Dadas dos secuencias ordenadas a[1]..a[M] y b[1]…b[N]

i=1; j=1;
a[M+1]=INT_MAX;b[N+1]=INT_MAX;
For (k=1;k<=M+N;k++)
c[k]=(a[i]<b[j]) ? a[i++] : b[j++];

el método usa obviamente M+N comparaciones


MergeSort

Si los datos se proporcionan como una


lista ligada, se minimiza el movimiento de
datos.
MergeSort

Procedure sort;
1. if i=j then return xi
2. else {
3. m=(i+j-1)/2;
4. return merge(sort(i,m), sort(m+1,j))
}
Heapsort
 Definición. Un heap es un arreglo A con
valores. Representa un árbol binario
completo que cumple: A[padre(i)]  A[i]
y está constituido de la siguiente forma:
– A[1] contiene la raíz
– A[2i] y A[2i+1]contienen respectivamente,
los hijos izquierdos y derechos de A[i]
– A[i/2] contiene al padre de A[i]
– Todo camino de una hoja a la raíz es una
secuencia ordenada linealmente
Heapsort
 Operaciones sobre un heap: Insertar, Quitar
el mayor, Reemplazar elementos a un heap.
Todos estos requieren menos de 2 logN
comparaciones.
 Un elegante y eficiente método de
ordenamiento sale de utilizar las operaciones
sobre heaps. Además no usa memoria extra.
Simplemente se construye un heap con los
elementos a ordenar y despues se van
quitando en el orden. Heapsort entonces
requiere menos de 2Nlog N comparaciones
 : Ejemplo ASORTINGEXAMPLE
Heapsort
procedure HEAPIFY(i,j):
if i is not a leaf and if a son of i contains a
larger elements than i does then
begin
let k be son of i with the largest
element;
interchange A[i] and A[k];
HEAPIFY(k, j)
end
Heapsort
procedure BUILDHEAP:
for i  n step - 1 until 1 do HEAPIFY(i,n)
Heapsort
BUILDHEAP;
for i  n step - 1 until 2 do {
interchange A[1] and A[i];
HEAPIFY (1, i - 1)
}
QuickSort
Quicksort es tal vez el mas usado de los
algoritmos. No usa mucho espacio
auxiliar y en promedio requiere N log N
operaciones. Pero es recursivo y en el
peor caso usa N2 operaciones.
QuickSort
QuickSort(A,p,r)
if p<r {
q=particion (A,p,r)
Quicksort(A,p,q)
Quicksort(A,q+1,r)
}
QuickSort
particion(A,p,r)
x=A[p]; i=p-1; j=r+1;
while true
repeat j=j-1 until a[j]<=x
repeat i=i+1 until a[i]>=x
if i<j exchange A[i],A[j]
else return j
QuickSort
En el mejor caso, cada etapa de
particionamiento divide el archivo
exactamente a la mitad. En ese caso la
recurrencia es CN=2CN/2+N i.e. NlogN
…pero esto no siempre sucede.
Sedgewick pp 121 para recurrencia
precisa. Se puede eliminar la recursion
usando un stack de manera explicita.
Aprovechamiento de la
estructura:Radix Sort
 Si tomamos en cuenta que los datos a
ordenar se representan como un número
en base M (la raiz). Hay varios de estos
métodos. Uno muy sencillo es el llamado
straight radix sort.
 Simplemente poner en representación
binaria y de derecha a izquierda poner los
ceros antes de los unos
Aprovechamiento de la
estructura:Radix Sort
Usa N log N comparaciones de bits.
Requiere menos que Nb
comparaciones para ordenar n
numeros de b bits. Se ordenan n
records con llaves de b bits en b/m
pasos usando M=2m espacio extra.
Aunque usamos M=2 aquí, lo mejor
es que M sea grande. Si tomamos
m=b/4 resulta un sort lineal

También podría gustarte