Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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).
El MERGE:
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++];
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