Consult A
Consult A
PRESENTADO POR:
PRESENTADO A:
SINCELEJO-SUCRE
2023
2
revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos
de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista
hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada.
Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos
durante los intercambios, como si fueran pequeñas «burbujas». También es conocido como
el método del intercambio directo. Dado que solo usa comparaciones para operar elementos,
orden incorrecto, los intercambia. Este proceso se repite hasta que no se realicen intercambios
en un pase completo a través de la lista. Aquí están los detalles paso a paso del algoritmo:
intercambiamos.
de la lista. En este punto, el elemento más grande ha "burbujeado" hasta el final de la lista.
5. Luego, repetimos los pasos 1-4, pero ignoramos el último elemento de la lista, ya que
Peor Caso: El peor caso ocurre cuando la lista está completamente desordenada y
lista.
Mejor Caso: El mejor caso ocurre cuando la lista ya está ordenada, y no se requiere
ningún intercambio durante el proceso. Aunque esto puede parecer ideal, la complejidad
temporal en el mejor caso sigue siendo O(n^2) ya que aún se deben hacer todas las
comparaciones.
Caso Promedio: El caso promedio también tiene una complejidad temporal de O(n^2)
ordenamiento simple pero ineficiente en la mayoría de los casos. Sin embargo, hay
situaciones muy limitadas en las que podría ser más eficiente que otros algoritmos:
Listas casi ordenadas: Si la lista está casi completamente ordenada y solo hay unos
pocos elementos fuera de lugar, el algoritmo de burbuja podría requerir un número limitado
de pasadas para ordenar la lista. Esto se debe a que el algoritmo solo realiza intercambios
ayudar a los estudiantes a comprender los conceptos básicos de cómo funcionan los
tiene una complejidad de tiempo promedio y peor caso de O(n^2), lo que significa que su
algoritmos más eficientes como QuickSort, MergeSort o HeapSort. Por lo tanto, en la mayoría
eficientes.
5
6
es una manera muy natural de ordenar para un ser humano y puede usarse fácilmente para
ordenar un mazo de cartas numeradas en forma arbitraria. Requiere O (n2) operaciones para
elemento menor (todos los elementos mayores han sido desplazados una posición a la
demás elementos.
ordenar una lista de elementos. Funciona tomando uno de los elementos no ordenados de la
lista y colocándolo en la posición correcta en la parte ordenada de la lista. Aquí están los
seleccionado con cada elemento en la parte ordenada hasta encontrar la posición correcta.
7
ordenada que son mayores que el elemento seleccionado hacia la derecha para hacer espacio
7. Repetimos los pasos 3-6 para cada elemento en la parte desordenada hasta que todos los
8. Cuando hayamos procesado todos los elementos, la lista estará completamente ordenada.
Peor Caso: El peor caso ocurre cuando la lista está en orden inverso, lo que significa
que cada elemento de la parte desordenada debe compararse y desplazarse hasta el principio
de la parte ordenada. En este caso, la complejidad temporal en el peor caso es O(n^2), donde
Mejor Caso: El mejor caso ocurre cuando la lista ya está completamente ordenada. En
Listas pequeñas: El algoritmo de ordenamiento por inserción puede ser más eficiente
mezcla, cuando se trata de listas pequeñas. Debido a su baja sobrecarga y simplicidad, puede
Listas casi ordenadas: Si la lista ya está parcialmente ordenada o tiene solo unos pocos
elementos fuera de lugar, el algoritmo de inserción tiende a funcionar bien, ya que solo
En general, el algoritmo de ordenamiento por inserción es una buena opción para listas
pequeñas o casi ordenadas, pero para listas más grandes o desordenadas, otros algoritmos
Consiste en encontrar el menor de todos los elementos del arreglo o vector e intercambiarlo
con el que está en la primera posición. Luego el segundo más pequeño, y así sucesivamente
utiliza para ordenar una lista de elementos en orden ascendente. Funciona seleccionando
la lista ordenada. Aquí tienes una explicación paso a paso del funcionamiento del algoritmo:
ordenada. Para hacer esto, recorre toda la lista no ordenada, comparando cada elemento con el
elemento mínimo encontrado hasta ahora. Si encuentra un elemento menor, lo marca como el
lista ordenada.
10
lista ordenada.
5. Finalización: El algoritmo continúa repitiendo los pasos anteriores hasta que no queden
Peor caso: El peor caso ocurre cuando la lista está en orden descendente, lo que
significa que, en cada iteración, se debe buscar el elemento mínimo en toda la lista no
lista.
Mejor caso: El mejor caso ocurre cuando la lista ya está ordenada. Aún así, el
algoritmo realizará comparaciones para determinar que los elementos ya están en orden, pero
intercambios.
listas grandes. Sin embargo, puede ser más eficiente que otros algoritmos de ordenamiento en
implementación, puede ser una opción adecuada para listas pequeñas o cuando no se dispone
Así, se puede escribir el siguiente pseudocódigo para ordenar una lista de n elementos
indexados desde el 1:
para i=1 hasta n-1;
minimo = i;
minimo = j
fin si
fin para
intercambiar(lista[i], lista[minimo])
fin para
como el QuickSort, MergeSort o incluso el BubbleSort. Sin embargo, hay situaciones en las
que el algoritmo de selección podría ser más eficiente que otros algoritmos:
12
no suele ser un problema crítico. En este caso, el algoritmo de selección puede ser una opción
intercambios, lo que puede ser beneficioso en sistemas con restricciones de memoria. Otros
algoritmos, como MergeSort, requieren memoria adicional para copiar elementos y dividir
listas.
Listas Casi Ordenadas: Si se sabe que la lista está casi ordenada, es decir, solo hay
unos pocos elementos fuera de lugar, el algoritmo de selección podría funcionar relativamente
rápido en comparación con otros algoritmos más complejos. Esto se debe a que, en promedio,
selección para que sea más eficiente. Por ejemplo, en lugar de buscar el elemento más
pequeño en cada iteración, se podría buscar tanto el elemento más pequeño como el más
aplicaciones donde el rendimiento sea crítico, ya que tiene una complejidad de tiempo
situaciones específicas como las mencionadas anteriormente, puede ser una opción aceptable
debido a su simplicidad y baja sobrecarga de memoria. Para listas más grandes y rendimiento
El ShellSort ordena por inserción de subconjuntos del vector que están separados entre sí
por iguales a la mitad del tamaño del vector, es decir, va armando subvectores de tamaño
Ejemplo.
Iteración 1:
El segundo subvector estará conformado por la posición 1 y 7 del vector original (Color
verde).
Subvector 1
Iteración 2:
Se modifica K, K=5/2=2.
Iteración 3:
Se modifica k. K=2/2=1.
16
Cuando k=1 sólo podenos obtener 1 subvector; el vector original. Cuando k=1 Shell
int cont=0;
int k=N/2;
while (k>=1){
int v = vec[j];
int n = j - k;
vec[n + k] = vec[n];
n-=k;
vec[n + k] = v;
17
k /= 2;
return vec;
Implementación
int vec[]={45,17,23,67,21,55,8,18,89,26,58};
System.out.println("Vector original");
imprimirVector(vec);
System.out.println("\n");
vec=ordenacionShell(vec);
imprimirVector(vec);
int cont=0;
int k=N/2;
while (k>=1){
int v = vec[j];
int n = j - k;
vec[n + k] = vec[n];
n-=k;
vec[n + k] = v;
k /= 2;
System.out.print("iteracion: "+(++cont)+":
");imprimirVector(vec);System.out.println();
return vec;
for(int i=0;i<vec.length;i++){
System.out.print(vec[i]+" ");
}
19
}
20
luego aplicando el algoritmo de inserción en cada uno de estos subconjuntos. A medida que
Aquí tienes una explicación paso a paso del funcionamiento del algoritmo:
una secuencia de incrementos que se utilizará para dividir la lista en subconjuntos. Estos
elementos que están separados por la distancia igual al primer incremento. Luego, en cada
pasada subsiguiente, los subconjuntos se crean tomando elementos separados por el siguiente
ordenamiento por inserción en cada uno de estos subconjuntos pequeños. Esto implica
comparar y mover los elementos dentro de cada subconjunto para que estén en orden.
hayan ordenado, se reduce la secuencia de incrementos. Esto significa que se pasa al siguiente
5. Repeticiones: Los pasos 2-4 se repiten hasta que la secuencia de incrementos llega a 1.
En ese punto, se realiza una última pasada con un incremento de 1, que es esencialmente una
6. Finalización: Una vez que se ha realizado la última pasada, la lista completa estará
ordenada.
incrementos subóptima, la complejidad puede ser peor que O(n^2), pero con secuencias de
incrementos adecuadas, como la secuencia de incrementos de Shell original (1, 4, 13, 40, ...),
Mejor caso: El mejor caso ocurre cuando la lista ya está casi ordenada, lo que
significa que los elementos en cada subconjunto están muy cerca de su posición final. En este
caso, el Shellsort puede tener un rendimiento cercano a O(n log n), dependiendo de la
Caso promedio: El caso promedio suele ser mejor que el peor caso, pero peor que el
Situaciones en las que el algoritmo podría ser más eficiente que otros:
Shellsort puede ser más eficiente que algoritmos de ordenamiento simples como el
Puede ser eficiente cuando se sabe que la lista está casi ordenada, ya que tiende a
Si se elige una secuencia de incrementos adecuada, Shellsort puede ser más rápido
tamaño moderado.
Sin embargo, para listas muy grandes, otros algoritmos de ordenamiento como Quicksort y
Mergesort tienden a ser más eficientes en general debido a su mejor complejidad temporal en
casos.
23
array en dos mitades repetidamente hasta que obtenemos el array dividido en elementos
mezcla combina repetidamente estas pequeñas matrices ordenadas para producir submatrices
ordenadas más grandes hasta que obtenemos una array final ordenada. Se utiliza mucho en
El método de ordenamiento por mezcla descendente comienza desde la parte superior con
el array completo y procede hacia abajo a los elementos individuales con recursión.
Merge ()
Inicializa 3 punteros i, j y k.
en output.
24
Escoge los elementos restantes y los inserta en output una vez que uno de los arrays se
ha agotado.
#include<iostream>
output[k] = arr[i];
k += 1; i += 1;
else {
output[k] = arr[j];
k += 1; j += 1;
output[k] = arr[i];
k += 1; i += 1;
output[k] = arr[j];
k += 1; j += 1;
int main() {
int n = 6;
}
27
Complejidad temporal
Caso medio
toma O(n) tiempo.
El peor caso
El mejor caso
dos mitades, ordena cada mitad de forma recursiva y luego combina (mezcla) las dos mitades
ordenadas para obtener la lista ordenada final. Aquí hay situaciones en las que el algoritmo de
ordenamiento por mezcla podría ser más eficiente que otros algoritmos:
conserva el orden relativo de elementos con valores iguales. Esto puede ser crucial en
28
aplicaciones donde se necesita mantener el orden original de los elementos que tienen valores
idénticos.
Listas enlazadas: En el caso de listas enlazadas, Merge Sort puede ser más eficiente
que otros algoritmos de ordenamiento, como QuickSort, que tienden a realizar más
operaciones de puntero. Merge Sort simplemente cambia los enlaces, lo que hace que sea más
Listas grandes y memoria disponible: Aunque Merge Sort tiene una complejidad
temporal de O(n log n), donde "n" es el número de elementos en la lista, puede ser más
requieren una cantidad significativa de memoria adicional para la pila de llamadas recursivas.
orden de la lista inicial. Incluso en el peor caso, su rendimiento es consistente. Esto lo hace
adecuado para listas que ya están parcialmente ordenadas o en las que no se conoce la
rendimiento pobre en el peor caso (O(n^2)), Merge Sort siempre tiene un rendimiento
consistente y predecible con una complejidad de tiempo de O(n log n) en todos los casos. Esto
lo hace adecuado para aplicaciones donde se requiere un rendimiento confiable en todos los
escenarios.
29
tienen listas grandes o se necesita un rendimiento predecible en todas las situaciones. Aunque
circunstancias.
n. Esta es la técnica de ordenamiento más rápida conocida. Fue desarrollada por C. Antony R.
Hoare en 1960. El algoritmo original es recursivo, pero se utilizan versiones iterativas para
mejorar su rendimiento (los algoritmos recursivos son en general más lentos que los
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
La lista queda separada en dos sublistas, una formada por los elementos a la izquierda
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.
n).
ordenadas. Pero principalmente depende del pivote, si por ejemplo el algoritmo implementado
toma como pivote siempre el primer elemento del array, y el array que le pasamos está
hay situaciones en las que el algoritmo QuickSort podría ser más eficiente que otros
algoritmos:
otros algoritmos de ordenamiento, como Bubble Sort o Insertion Sort, especialmente cuando
se trata de listas grandes y desordenadas. Su complejidad promedio es de O(n log n), lo que lo
mejor caso, con una complejidad de tiempo de O(n log n). Esto lo convierte en una excelente
elección cuando se trabaja con listas que ya están parcial o completamente ordenadas, ya que
adicional para mantener las sublistas en cada llamada recursiva, QuickSort es un algoritmo de
ordenamiento in situ. Esto significa que no necesita memoria adicional para copiar elementos
necesita realizar una búsqueda en tiempo real mientras se mantiene la lista ordenada. A
medida que los elementos se ordenan, se pueden buscar y recuperar rápidamente en la lista
ordenada.
32
situaciones y tamaños de datos. Puede optimizarse para tratar con datos específicos o
todos los casos. En situaciones donde se requiere un rendimiento consistente en todos los
casos (por ejemplo, en aplicaciones críticas), algoritmos como MergeSort pueden ser
pobre en el peor caso (O(n^2)) en listas que ya están ordenadas en orden ascendente o
descendente. En tales casos, algoritmos como MergeSort o HeapSort pueden ser más
elección del algoritmo de ordenamiento debe basarse en las características específicas de los
BIBLIOGRAFIA
https://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
https://es.wikipedia.org/wiki/Ordenamiento_por_inserci%C3%B3n
https://www.ecured.cu/Algoritmo_de_ordenamiento_por_selecci%C3%B3n
https://tutospoo.jimdofree.com/tutoriales-java/m%C3%A9todos-de-ordenaci%C3%B3n/
shellshort/
https://www.delftstack.com/es/tutorial/algorithm/merge-sort/
https://es.wikipedia.org/wiki/Quicksort
http://mis-algoritmos.com/ordenamiento-rapido-quicksort#!