Beruflich Dokumente
Kultur Dokumente
Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar vectores
con valores asignados aleatoriamente. Para poder ordenar una cantidad determinada de
números almacenadas en un vector o matriz, existen distintos métodos (algoritmos) con
distintas características y complejidad.
Existe desde el método más simple, como el Bubblesort (o Método Burbuja), que son
simples iteraciones, hasta el Quicksort (Método Rápido), que al estar optimizado usando
recursión, su tiempo de ejecución es menor y es más efectivo.
A. METODOS ITERATIVOS
Estos métodos son simples de entender y de programar ya que son iterativos, simples ciclos
y sentencias que hacen que el vector pueda ser ordenado.
Dentro de los Algoritmos iterativos encontramos:
1. BURBUJA:
Es uno de los más simples, es tan fácil como comparar todos los elementos de una lista
contra todos, si se cumple que uno es mayor o menor otro, entonces los intercambia de
posición.
Por ejemplo, imaginemos que tenemos los siguientes valores:
1 8 9 3 25
Lo que haría una burbuja simple, seria comenzar recorriendo los valores de izq. a
derecha, comenzando por el 1. Lo compara con el 8, con el 8, con el 3 y con el 25, si es
mayor o menor (dependiendo si el orden es ascendiente o descendente) se
intercambian de posición. Luego continua con el siguiente, con el 8, y lo compara con todos
los elementos de la lista, esperando ver si se cumple o no la misma condición que con el
primer elemento. Así, sucesivamente, hasta el último elemento de la lista.
Estos métodos son aún más complejos, requieren de mayor atención y conocimiento para
ser entendidos. Son rápidos y efectivos, utilizan generalmente la técnica Divide y vencerás,
que consiste en dividir un problema grande en varios pequeños para quesea más fácil
resolverlos.
Mediante llamadas recursivas a sí mismos, es posible que el tiempo de ejecución y de
ordenación sea más óptimo. Dentro de los algoritmos recursivos encontramos:
Este algoritmo consiste básicamente en dividir en partes iguales la lista de números y luego
mezclarlos comparándolos, dejándolos ordenados. Si se piensa en este algoritmo
recursivamente, podemos imaginar que dividirá la lista hasta tener un elemento en cada
lista, luego lo compara con el que está a su lado y según corresponda, lo sitúa donde
corresponde.
2. ORDENAMIENTO RÁPIDO (QUICK):
El algoritmo quicksort es quizá el más eficiente de los algoritmos de ordenamiento, debido
a que su complejidad es mínima y por lo tanto su tiempo de ejecución también es mínimo.
Se divide la lista en dos sub-listas y ordenarlas en forma independiente cada una. El
proceso de partición es repetido hasta llegar a listas de tamaño 1 (que están ordenadas).
Lo central en este método es encontrar un método eficiente para particionar la lista en dos
partes, tal que:
Todos los elementos de una sub-lista deben ser menores que un elemento llamado pivote.
Todos los elementos en la otra sub-lista deben ser mayores que el pivote.
Si asumimos que los elementos de la lista están almacenados en un arreglo, el método para
particionar el arreglo en dos es como sigue:
Ponga un índice al segundo elemento del arreglo (i1) y otro al último elemento (i2).
Decremente i2 hasta que encuentre un elemento con valor menor que el pivote o i2 llegue
a i1. Incremente i1 hasta que encuentre un elemento mayor que el pivote o hasta
que i1 llegue a i2. Llamaremos a este proceso “búsqueda”.
Si los dos índices son distintos, los dos elementos del arreglo (los apuntados por i2 e i1)
están fuera de lugar, por lo que se intercambian. Repita el paso anterior de búsqueda,
resumiendo la operación donde se había quedado.
Si los dos índices son iguales y el valor que ambos índices apuntan es menor que el pivote,
intercámbielos. El arreglo está ahora particionado por el elemento referenciado por i2 (o i1).
La localización del pivote separa el arreglo en una porción donde todos sus valores son
menores que el pivote, y otra porción donde todos sus valores son mayores que el pivote.
Ejemplo:
Publicado
El ordenamiento de burbuja
bidireccional
El ordenamiento de burbuja bidireccional (también llamado "método de la sacudida"
o "coctail sort" o "shaker sort") es un algoritmo de ordenamiento que surge como
una mejora del algoritmo ordenamiento de burbuja.
Pseudocódigo
Caml
Pascal
Python
C
Modelo gráfico
Diagrama
Comparaciones :
Movimientos :
Mezclar
Resolver
1
def ordenamientoPorSeleccion(unaLista):
2
for llenarRanura in range(len(unaLista)-1,0,-1):
3
posicionDelMayor=0
4
for ubicacion in range(1,llenarRanura+1):
5
if unaLista[ubicacion]>unaLista[posicionDelMayor]:
6
posicionDelMayor = ubicacion
7
8
temp = unaLista[llenarRanura]
9
unaLista[llenarRanura] = unaLista[posicionDelMayor]
10
unaLista[posicionDelMayor] = temp
11
12
unaLista = [54,26,93,17,77,31,44,55,20]
13
ordenamientoPorSeleccion(unaLista)
14
print(unaLista)
15
Next Section - 5.9. El ordenamiento por inserción
user not logged in
Ordenamiento de burbuja
bidireccional – Algoritmos de
ordenamiento
Publicado por Andrea Navarro en 25 octubre, 2016
Mejor caso:
Caso promedio:
Peor caso:
1 #include<stdio.h>
2
3 #define N 5
4
5 int main(int argc, char** argv){
6
7 int lista[N]={5,2,4,1,3};
8
9 int inicioIndice=0;
10 int finIndice=N-1;
11 int i,aux,intercambio=0;
12
13 //Recorrer la lista hasta que no haya números para ordenar
14 while(inicioIndice<=finIndice){
15 int nuevoPrimerIndice=finIndice,nuevoInicioIndice;
16 int nuevoFinIndice=inicioIndice;
17
18 //Ordenado hacia adelante
19 for(i=inicioIndice;i<finIndice;i++){
20 //Comparando valores
21 if(*(lista+i)>*(lista+i+1)){
22 //Intercambio valores
23 aux=*(lista+i);
24 *(lista+i)=*(lista+i+1);
25 *(lista+i+1)=aux;
26 //Marcar que ha ocurrido un intercambio
27 intercambio=1;
28 //Marcar último número ordenado al final de la
29 *(lista
30 nuevoFinIndice=i;
31 }
32 }
33
34 if(!intercambio){
35 //Si no se ha realizado ningún cambio salir de la iteracion
36 break;
37 }
38
39 //Marcar el último número ordenado al final de la *(lista como
40 final para no evaluarlo la siguiente iteración
41 finIndice=nuevoFinIndice;
42 intercambio=0;
43
44 //Ordenado hacia atras
45 for(i=finIndice;i>=inicioIndice;i--){
46 //Comparando valores
47 if(*(lista+i)>*(lista+i+1)){
48 //Intercambio valores
49 aux=*(lista+i);
50 *(lista+i)=*(lista+i+1);
51 *(lista+i+1)=aux;
52 //Marcar que ha ocurrido un intercambio
53 intercambio++;
54 //Marcar último número ordenado al principio de la
55 *(lista
56 nuevoInicioIndice=i;
57 }
58 }
59
60 if(!intercambio){
61 //Si no se ha realizado ningún cambio salir de la iteracion
62 break;
63 }
64
65 //Marcar el último número ordenado al principio de la *(lista
66 como final para no evaluarlo la siguiente iteración
67 inicioIndice=nuevoInicioIndice+1;
68 }
return 0;
}
Código en PHP
1 <?php
2
3 $lista[0]=5;
4 $lista[1]=2;
5 $lista[2]=4;
6 $lista[3]=1;
7 $lista[4]=3;
8
9 $inicioIndice=0;
10 $finIndice=count($lista)-1;
11 $lon=count($lista);
12
13 //Recorrer la lista hasta que no haya números para ordenar
14 while($inicioIndice<=$finIndice)
15 {
16 $nuevoPrimerIndice=$finIndice;
17 $nuevoFinIndice=$inicioIndice;
18
19 //Ordenado hacia adelante
20 for($i=$inicioIndice;$i<$finIndice;$i++)
21 {
22 //Comparando valores
23 if($lista[$i]>$lista[$i+1])
24 {
25 //Intercambio valores
26 $aux=$lista[$i];
27 $lista[$i]=$lista[$i+1];
28 $lista[$i+1]=$aux;
29 //Marcar que ha ocurrido un intercambio
30 $intercambio=true;
31 //Marcar último número ordenado al final de la lista
32 $nuevoFinIndice=$i;
33 }
34 }
35
36 if($intercambio == false)
37 {
38 //Si no se ha realizado ningún cambio salir de la iteracion
39 break;
40 }
41
42 //Marcar el último número ordenado al final de la lista como final para
43 no evaluarlo la siguiente iteración
44 $finIndice=$nuevoFinIndice;
45 $intercambio=false;
46
47 //Ordenado hacia atras
48 for($i=$finIndice;$i>=$inicioIndice;$i--)
49 {
50 //Comparando valores
51 if($lista[$i]>$lista[$i+1])
52 {
53 //Intercambio valores
54 $aux=$lista[$i];
55 $lista[$i]=$lista[$i+1];
56 $lista[$i+1]=$aux;
57 //Marcar que ha ocurrido un intercambio
58 $intercambio=true;
59 //Marcar último número ordenado al principio de la lista
60 $nuevoInicioIndice=$i;
61 }
62 }
63
64 if($intercambio == false)
65 {
66 //Si no se ha realizado ningún cambio salir de la iteracion
67 break;
68 }
69
70 //Marcar el último número ordenado al principio de la lista como final
71 para no evaluarlo la siguiente iteración
72 $inicioIndice=$nuevoInicioIndice+1;
}
Espero que les sirva!
Su complejidad es de 0(n^2).
1. /*
6. */
7.
8. #include<iostream>
9. #include<conio.h>
11.
16.
17. int main(void)
18. {
21. int n;
22. cout<<"\t****************************************************\n";
25. cout<<"\t****************************************************\n\n\n";
26.
28.
33.
34.
35. getch();
36. return 0;
37. }
38.
44. if(x[j-1]>x[j])
46. x[j-1]=x[j];
47. x[j]=aux;
48. }
49.
53. }
54.
56. {int i;
59. }
Tipos de ordenamiento
Ordenamiento por inserción
Para poder explicar lo haremos con un ejemplo simple. El arreglo tiene 10 elementos
desordenados como lo vemos aquí:
Ahora va el tercer elemento. Lo comparo con el segundo y veo que es menor así que
los intercambio. Luego lo comparo con el primero y también es menor así que los
intercambio. Como ya es el primer elemento, ahí le paro (es el menor de todos los
que he revisado hasta ahorita). Este proceso lo pueden ver en estas figuras:
Ahora vamos con el cuarto elemento (el 8) y lo comparo con el tercero (10). Como
es menor los intercambio y lo comparo con el segundo (3). Como no es
menor, ahí se queda. Estas son las imágenes:
Ahora hago lo mismo con el quinto elemento (15) el cual no se mueve por ser mayor
que el cuarto (10) como se ve aquí:
REPORT THIS AD
Lo mismo con el sexto (5):
Y ahora el octavo:
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.
4–3–5–2–1
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
3–4–2–1–5
REPORT THIS AD
3–2–1–4–5
2–1–3–4–5
1–2–3–4–5
Este algoritmo se basa en hacer comparaciones, así que para que realice su trabajo
de ordenación son imprescindibles dos cosas: Un array o estructura similar de
elementos comparables y un criterio claro de comparación, ta que dados dos
elementos nos diga si están en orden o no.
Explicación:
Su funcionamiento es el siguiente:
4 12 16 24 36 3
En el método de inserción directa, los saltos se hacen de una posición en una posición
y se necesitaran cinco comparaciones. En el método de Shell, si los saltos son de dos
posiciones, se realizaran comparaciones.
4 12 16 24 36 3
EJEMPLO :
REPORT THIS AD
6, 1, 5, 2, 3, 4, 0
2 3 0,1,4,2,3,5,6 (2,0)
3 3 0,1,4,2,3,5,6 NINGUNO
4 1 0,1,2,3,4,5,6 (4,2),(4,3)
5 1 0,1,2,3,4,5,6 NINGUNO
Ordenamiento HeapSort.
Su desempeño es en promedio tan bueno como el Quicksort y se comporta mejor que
este último en los peores casos. Aunque el Heapsort tiene un mejor desempeño
general que cualquier otro método presentado de clasificación interna, es bastante
complejo de programar. El Heapsort fue desarrollado en 1964 por J. W. J. Williams.
» Las llaves están acomodadas en los nodos de tal manera que, para cada nodo i,
Ki <= Kj donde el nodo j es el padre del nodo i. Es decir, al recorrer el camino desde
la raíz hacia abajo, las claves se encuentran en orden descendente.
»El árbol se llena de izquierda a derecha, lo que implica que si algún(os) nodo(s) no
está(n) en el mismo nivel que el resto, éste(os) estará(n) entonces lo más a la
izquierda posible del árbol.
En efecto, se puede usar un arreglo A[1..n], donde los hijos de A[i] son A[2*i] y
A[condición del Heap se puede re-formular:
73 – 50 – 36 – 21 – 46 – 27 – 9 – 18 – 10 – 30
PUBLICIDAD
Ordenamiento de burbuja
Espacios de nombres
Página
Discusión
Acciones de página
Ver
Ver código
Historial
Sumario
[ocultar]
1 Descripción
2 Análisis del Costo Computacional
3 Aplicación
4 Implementación
5 Ver además
6 Fuentes
Descripción
El procedimiento de la burbuja es el siguiente: § Ir comparando desde la casilla 0
número tras número hasta encontrar uno mayor, si este es realmente el mayor de
todo el vector se llevará hasta la última casilla, si no es así, será reemplazado por uno
mayor que él. § Este procedimiento seguirá así hasta que haya ordenado todas las
casillas del vector. § Una de las deficiencias del algoritmo es que ya cuando a
ordenado parte del vector vuelve a compararlo cuando esto ya no es necesario.
Dado un vector a1, a2, a3, ... an 1) Comparar a1 con a2 e intercambiarlos si a1>a2 (o
a12) 2) Seguir hasta que todo se haya comparado an-1 con an 3) Repetir el proceso
anterior n-1 veces
Algoritmo: Complejidad for(i=0; i < n-++){ T(n2)
Por lo que no se puede determinar una cota ajustada asintótica del número de
intercambios, dado que este dependerá del orden del vector en cuestión.
Rendimiento en el caso desfavorable
Si pasamos al algoritmo un vector ordenado en orden inverso realizara un número de
comparaciones:
El ordenamiento de burbuja tiene una complejidad Ω(n²) igual que ordenamiento por
selección. Cuando una lista ya está ordenada, a diferencia del ordenamiento por
inserción, que pasará por la lista una vez y encontrará que no hay necesidad de
intercambiar las posiciones de los elementos, el método de ordenación por burbuja
está forzado a pasar por dichas comparaciones, lo que hace que su complejidad sea
cuadrática en el mejor de los casos. Esto lo cataloga como el algoritmo más
ineficiente que existe, aunque para muchos programadores sea el más sencillo de
implementar.
Aplicación
A pesar de que el ordenamiento de burbuja es uno de los algoritmos más sencillos de
implementar, su orden O(n2) lo hace muy ineficiente para usar en listas que tengan
más que un número reducido de elementos. Incluso entre los algoritmos de
ordenamiento de orden O(n2), otros procedimientos como el ordenamiento por
inserción son considerados más eficientes. Dada su simplicidad, el ordenamiento de
burbuja es utilizado para introducir el concepto de algoritmo de ordenamiento para
estudiantes de ciencias de la computación. A pesar de esto, algunos investigadores
como Owen Astrachan han criticado su popularidad en la enseñanza de ciencias de la
computación, llegando a recomendar su eliminación de los planes de estudio. Sumado
a esto, Jargon File, un libro ampliamente citado en la cultura hacker, lo denomina "el
mal algoritmo genérico", y Donald Knuth, uno de los mayores expertos en ciencias de
la computación, afirma que el ordenamiento de burbuja "no parece tener nada para
recomendar su uso, a excepción de un nombre pegajoso y el hecho de que conlleva a
problemas teóricos interesantes". El ordenamiento de burbuja es asintóticamente
equivalente, en tiempos de ejecución, con el ordenamiento por inserción en el peor de
los casos, pero ambos algoritmos difieren principalmente en la cantidad de
intercambios que son necesarios. Resultados experimentales como los descubiertos
por Astrachan han demostrado que el ordenamiento por inserción funciona
considerablemente mejor incluso con listas aleatorias. Por esta razón, muchos libros
de algoritmos modernos evitan usar el ordenamiento de burbuja, reemplazándolo por
el ordenamiento por inserción. El ordenamiento de burbuja interactúa vagamente con
el hardware de las CPU modernas. Requiere al menos el doble de escrituras que el
ordenamiento por inserción, el doble de pérdidas de cache, y asintóticamente más
predicción de saltos. Varios experimentos de ordenamiento de cadenas en Java
hechos por Astrachan muestran que el ordenamiento de burbuja es 5 veces más lento
que el ordenamiento por inserción, y 40% más lento que el ordenamiento por
selección.
Implementación
A continuación se muestra el Ordenamiento de burbuja en algunos de los lenguajes
de programación más usados:
C
int temp, i, j;
C++
C#
Java
Perl
sub bubblesort {
Visual Basic
PHP
<?php
//Ordenamiento por burbuja $numeros = array(9, 4, -1, 7, 8, 11, 6, 12, 10, 5);
$n = count($numeros);
print_r($numeros);
Pascal
begin
end;
Ver además
Algoritmo de ordenamiento
Algoritmo de búsqueda
Algoritmo de Kruskal
Algoritmo de Euclides
Algoritmo de Prim
Algoritmo de Boruvka
Algoritmo de Gutmann
Algoritmo criptográfico
Algoritmo
Algoritmo de Ordenamiento Shell
Algoritmo genético
Algoritmo de ordenamiento por selección
Algoritmo de árboles de decisión de Microsoft
Algoritmo de Búsqueda Heurística A*
Algoritmo asimétrico
Fuentes
Aprenda C/C++.
Estructuras de datos.
Wikipedia.
Normativa de privacidad
EcuRed
Exoneraciones
Inicio
Tips and Tricks
Ordenamiento por burbuja
Es necesario recorrer varias veces toda la lista hasta que no se necesiten más intercambios,
es decir, la lista ya se ha ordenado. 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". Como solo se usan comparaciones entre elementos, es considerado un
algoritmo de comparación, siendo uno de los más sencillos de implementar.
Aunque en JavaScript, los objetos arrays disponen del método sort() para ordenar
elementos, pero en esta ocasión no lo vamos a utilizar ya que lo que pretendemos es
mostrar como se implementa el algoritmo de burbuja en JavaScript.
En el ejemplo siguiente se declara un array de 15 números desordenados. Utilizando el
método de burbuja simple, se ordena la lista.
function Burbuja() {
var lista = [389, 703, 247, 563, 224, 714, 464, 953, 708, 201, 887, 550, 515, 206,
131];
var n, i, k, aux;
n = lista.length;
// Algoritmo de burbuja
aux = lista[i];
lista[i + 1] = aux;
}
}
Burbuja Optimizado
Implementa una mejora al método de ordenamiento burbuja. Este método
recorre todo el arreglo comparando cada uno de los elementos con el
elemento siguiente e intercambiándolo de ser necesario. Al finalizar la
iteración el elemento mayor queda ubicado en la última posición, mientras
los elementos menores ascienden una posición.
Ejemplo:
Algoritmo de burbuja optimizado
public static int[] ordenacionBurbuja(int vec[]){
final int N=vec.length;
for(int i=N-1;i>0;i--){
for(int j=0;j<i;j++){
if(vec[j]>vec[j+1]){
int temp=vec[j];
vec[j]=vec[j+1];
vec[j+1]=temp;
}
}
System.out.print("iteracion: "+(N-i)+":
");imprimirVector(vec);System.out.println();
}
return vec;
}
Implementación
public class BurbujaOptimizado {
}
Método de Ordenamiento Burbuja en C#
Este método consiste en ir comparando cada par de elementos del array e ir moviendo el mayor
elemento hasta la última posición, comenzando desde la posición cero. Una vez acomodado el
mayor elemento, prosigue a encontrar y acomodar el segundo más grande comparando de
nuevo los elementos desde el inicio de la lista, y así sigue hasta ordenar todos los elementos
del arreglo. Al ser necesario revisar varias veces toda la lista hasta que no se necesiten más
intercambios, hace que el ordenamiento por burbuja sea uno de los algoritmos más ineficientes
que existen. Incluso entre los algoritmos de ordenamiento del mismo orden, otros como el
“Ordenamiento por inserción” son considerados más eficientes. Y lo más curioso es que este
procedimiento es uno de los más usados para ordenar listas en todos los lenguajes de
programación.
Estos serían los pasos a seguir por este algoritmo para ordenar una lista a1, a2, a3, … an
1) Comparar a1 con a2 e intercambiarlos si a1>a2
2) Seguir hasta que se haya comparado an-1 con an
3) Repetir el proceso anterior n-1 veces
Ejemplo:
25 57 48 37 12 92 86 33
25 48 37 12 57 86 33 92
Observe que después del primer paso, el elemento mayor (en este caso 92) está en la posición
correcta dentro del arreglo. En general x[n-i] estará en su posición correcta después de la
iteración i. El método se lama ordenamiento de burbuja porque cada número “burbujea” con
lentitud hacia su posición correcta. El conjunto completo de iteraciones es:
iteración 0 : 25 57 48 37 12 92 86 33
iteración 1: 25 48 37 12 57 86 33 92
iteración 2: 25 37 12 48 57 33 86 92
iteración 3: 25 12 37 48 33 57 86 92
iteración 4: 12 25 37 33 48 57 89 92
iteración 5: 12 25 33 37 48 57 89 92
namespace Burbuja
{
class Burbuja
{
private int[] vector;
Ejercicios
Principal
A2
Acerca
Acerca De
Actualmente
Alcohol Treatment
Alcoholism
Algoritmo
Almacenar
4 comentarios:
1.
2.
Pones un contador en cada uno de los For y luego los sumas, o bien puedes poner
uno como comparaciones y otro como intercambios.
Responder
3.
4.
Este es un programa de es uno de vectores que usa 10 números y los ordena depende su valor por
ejemplo si el "numero>0 o numero<0 o si numero=0" con el método de burbuja marcando el
resultado con distintos colores.
Module Module1
código:
le damos play y introducimos datos
NOTA :
Sino comprenden el funcionamiento de alguna etiqueta visita
Herramientas Básicas en buscador del sitio.
Publicado 12th May 2013 por Unknown
1
Ver comentarios