Está en la página 1de 14

UNIVERSIDAD ESTATAL PENINSULA DE

SANTA ELENA

ALGORITMO
DE BUSQUEDA
Y
ORDENAMIEN
TO
FUNDAMENTO DE
PROGRAMACION

INGRID KARINA SANDOVAL BARRERA


JONATHAN ANDRES ALMEIDA CASTILLO
Algoritmo de ordenamiento

En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone


elementos de una lista o un vector en una secuencia dada por una relación de orden, es
decir, el resultado de salida ha de ser una permutación —o reordenamiento— de la
entrada que satisfaga la relación de orden dada. Las relaciones de orden más usadas son
el orden numérico y el orden lexicográfico. Ordenamientos eficientes son importantes
para optimizar el uso de otros algoritmos (como los de búsqueda y fusión) que requieren
listas ordenadas para una ejecución rápida. También es útil para poner datos en forma
canónica y para generar resultados legibles por humanos.

Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran


cantidad de investigación, 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 día 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 computación, donde la
abundancia de algoritmos para el problema proporciona una gentil introducción a la
variedad de conceptos núcleo de los algoritmos, como notación de O mayúscula,
algoritmos divide y vencerás, estructuras de datos, análisis de los casos peor, mejor, y
promedio, y límites inferiores.

Clasificación

Los algoritmos de ordenamiento se pueden clasificar en las siguientes maneras:

La más común es clasificar según el lugar donde se realice la ordenación

Algoritmos de ordenamiento interno: en la memoria del ordenador.

Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.

Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o


inversamente ordenadas:
Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está
ordenada.

Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está


inversamente ordenada.

Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían


originalmente los elementos con claves iguales. Por ejemplo, si una lista ordenada por
fecha se reordena en orden alfabético con un algoritmo estable, todos los elementos
cuya clave alfabética sea la

misma quedarán en orden de fecha. Otro caso sería cuando no interesan las mayúsculas
y minúsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado
ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos
son indistinguibles (porque cada elemento se ordena por la clave completa) la
estabilidad no interesa. Los algoritmos de ordenamiento que no son estables se pueden
implementar para que sí lo sean. Una manera de hacer esto es modificar artificialmente
la clave de ordenamiento de modo que la posición original en la lista participe del
ordenamiento en caso de coincidencia.

Los algoritmos se distinguen por las siguientes características:

Complejidad computacional (peor caso, caso promedio y mejor caso) en términos de n,


el tamaño de la lista o arreglo. Para esto se usa el concepto de orden de una función y se
usa la notación O(n). El mejor comportamiento para ordenar (si no se aprovecha la
estructura de las claves) es O(n log n). Los algoritmos más simples son cuadráticos, es
decir O(n²). Los algoritmos que aprovechan la estructura de las claves de ordenamiento
(p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamaño del espacio de claves.
Como dicho tamaño es conocido a priori, se puede decir que estos algoritmos tienen un
desempeño lineal, es decir O(n).

Uso de memoria y otros recursos computacionales. También se usa la notación O(n).

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 números enteros, o más
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
números están 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) (4, 1) (5, 6) (orden mantenido)

(3, 1) (3, 7) (4, 1) (5, 6) (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
solución poco práctica, ya que generalmente acarrea tener almacenamiento adicional.

Ordenar según una clave primaria, secundaria, terciara, etc., puede ser realizado
utilizando cualquier método de ordenamiento, tomando todas las claves en
consideración (en otras palabras, usando una sola clave compuesta). Si un método de
ordenamiento es estable, es posible ordenar múltiples í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 números, usando ambos valores

(4, 1) (3, 7) (3, 1) (4, 6) (original)

(4, 1) (3, 1) (4, 6) (3, 7) (después de ser ordenado por el segundo valor)

(3, 1) (3, 7) (4, 1) (4, 6) (después de ser ordenado por el primer valor)

Por otro lado:

(3, 7) (3, 1) (4, 1) (4, 6) (después de ser ordenado por el primer valor)

(3, 1) (4, 1) (4, 6) (3, 7) (después de ser ordenando por el segundo valor,

el orden por el primer valor es perturbado)

Lista de algoritmos de ordenamiento

Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta la


complejidad computacional.

Lista de algoritmos de ordenamiento

Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta


la complejidad computacional.
Estables
Nombre
Nombre traducido Complejidad Memoria Método
original

Ordenamiento de
Bubblesort O(n²) O(1) Intercambio
burbuja

Ordenamiento de
burbuja Cocktail sort O(n²) O(1) Intercambio
bidireccional

Ordenamiento por
Insertion sort O(n²) O(1) Inserción
inserción

Ordenamiento por No
Bucket sort O(n) O(n)
casilleros comparativo

Ordenamiento por Counting No


O(n+k) O(n+k)
cuentas sort comparativo

Ordenamiento por
Merge sort O(n log n) O(n) Mezcla
mezcla

Ordenamiento Binary tree


O(n log n) O(n) Inserción
con árbol binario sort

Pigeonhole
O(n+k) O(k)
sort

Ordenamiento Radix sort O(nk) O(n) No


Radix comparativo

Distribution
O(n³) versión recursiva O(n²)
sort

Gnome sort O(n²) O(1)

Inestables

Nombre
Nombre traducido Complejidad Memoria Método
original

Ordenamiento
Shell sort O(n1.25) O(1) Inserción
Shell

Comb sort O(n log n) O(1) Intercambio

Ordenamiento por Selection


O(n²) O(1) Selección
selección sort

Ordenamiento por
Heapsort O(n log n) O(1) Selección
montículos

Smoothsort O(n log n) O(1) Selección

Ordenamiento Promedio: O(n log n),
Quicksort O(log n) Partición
rápido peor caso: O(n²)
Promedio: O(n u),
Several peor caso: O(n²);
Unique Sort u=n; u = número único
de registros

Cuestionables, imprácticos

Nombre
Nombre traducido Complejidad Memoria Método
original

O(n × n!), peor: no
Bogosort
termina

O(n), excepto en
Ordenamiento de Pancake
máquinas de Von
panqueques sorting
Neumann

Ordenamiento Promedio: O(n!) Peor:


Randomsort
Aleatorio No termina

Algoritmos de Búsqueda y Ordenamiento

ALGORITMOS DE BÚSQUEDA
 Búsqueda Secuencial
 Búsqueda Binaria
 Búsqueda Hashing
ALGORITMOS DE ORDENAMIENTO
 Ordenamiento de Burbuja
 Ordenamiento por Inserción
 Ordenamiento por selección
 Ordenamiento con árbol binario
 Ordenamiento Shell
 Ordenamiento rápido (Quicksort)
 Ordenamiento por montículos (Heapsort)
BÚSQUEDA SECUENCIAL
Consiste en ir comparando el elemento que se busca con cada elemento del arreglo hasta
que se encuentra.

EL ALGORITMO SERIA:
for (i=0; i < LARGO; i++)
if (a[i]==Elemento_buscado)
printf(“Elemento encontrado en: %d\n”, i);

BÚSQUEDA BINARIA
Para utilizar este algoritmo, el arreglo debe estar ordenado y no se deben repetir los
elementos. La búsqueda binaria consiste en dividir el arreglo en dos subarreglos más
pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se
termina. En cada iteración el arreglo se divide en dos.

EJEMPLO
Se intenta buscar el elemento 3 en el arreglo {1,2,3,4,5,6,7,8,9}, se realizaran los
siguientes pasos.
ORDENAMIENTO BURBUJA
Consiste en ciclar repetidamente a través de la lista, comparando elementos adyacentes
de dos en dos. Si un elemento es mayor que el que está en la siguiente posición se
intercambian.

 Vamos a ver un ejemplo. Esta es nuestra lista:


4–3–5–2–1

 Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos


comparando el primero con el segundo elemento. 4 es mayor que 3, así
que intercambiamos. Ahora tenemos:
3 – 4 – 5 – 2 – 1

 Ahora comparamos el segundo con el tercero: 4 es menor que 5, así que


no hacemos nada. Continuamos con el tercero y el cuarto: 5 es mayor
que 2. Intercambiamos y obtenemos:
3 – 4 – 2 – 5 – 1

 Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos


nuevamente:
3 – 4 – 2 – 1 – 5

 Repitiendo este proceso vamos obteniendo los siguientes resultados:


3–2–1–4–5

2–1–3–4–5

1–2–3–4–5

EL ALGORITMO SERIA:
for (i=1; i<TAM; i++)
for j=0 ; j<TAM – 1; j++)
if (lista[j] > lista[j+1])
temp = lista[j];
lista[j] = lista[j+1];
lista[j+1] = temp;

ARBOLES DE ORDENAMIENTO
Un árbol binario es aquel que está formado por un nodo cuyos subárboles izquierdo y
derecho son a su vez arboles binario. (5,3,2,9,7,6,8,10).

ORDENAMIENTO POR SELECCION


 Buscas el elemento más pequeño de la lista.
 Lo intercambias con el elemento ubicado en la primera posición de la
lista.
 Buscas el segundo elemento más pequeño de la lista.
 Lo intercambias con el elemento que ocupa la segunda posición en la
lista.
 Repites este proceso hasta que hayas ordenado toda la lista.
EJEMPLO
 Vamos a ordenar la siguiente lista
4–3–5–2–1

 Comenzamos buscando el elemento menor entre la primera y última


posición. Es el 1. Lo intercambiamos con el 4 y la lista queda así:
1 – 3 – 5 – 2 – 4

 Ahora buscamos el menor elemento entre la segunda y la ultima


posición. Es el 2. Lo intercambiamos con el elemento en la segunda
posición , es decir el 3. La lista queda así:
1 – 2 – 5 – 3 – 4

 Buscamos el menor elemento entre la tercera posición y la última. Es el


3, que intercambiamos con el 5:
1 – 2 – 3 – 5 – 4

 El menor elemento entre la cuarta y quinta posición es el 4, que


intercambiamos con el 5:
1 – 2 – 3 – 4 – 5

 Ya tenemos nuestra lista ordenada.


ALGORITMO
1. for (i=0; i<TAM – 1; i++)
2. pos_men = Menor(lista, TAM, i);
3. temp = lista[i];
4. lista[i] = lista [pos_men];
5. lista [pos_men] = temp;
 Nota: Menor(lista, TAM, i) es una función que busca el menor elemento
entre las posiciones i y TAM-1.
ORDENAMIENTO POR INSERCIÓN
Tomo la primera y la coloco en mi mano. Luego tomo la segunda y la comparo con la
que tengo: si es mayor, la pongo a la derecha, y si es menor a la izquierda. Después
tomo la tercera y la comparo con las que tengo en la mano, desplazándola hasta que
quede en su posición final. Continúo haciendo esto, insertando cada carta en la posición
que le corresponde, hasta que las tengo todas en orden.

ALGORITMO
1. for (i=1; i<TAM; i++)
2. temp = lista[i];
3.  j = i – 1;
4. while ( (lista[j] > temp) && (j >= 0) )
5.  lista[j+1] = lista[j];
6.  j–;
7.  lista[j+1] = temp;
 Nota: En cada iteración del ciclo externo los elementos 0 a i forman una
lista ordenada.

También podría gustarte