jueves, 28 de noviembre de 2013
martes, 26 de noviembre de 2013
Características Teóricas
Es un método iterativo. Es utilizado para resolver problemas que pueden involucrar muchas variables También se clasifica como un método de ordenamiento interno ya que trabajan en memoria principal y sus implementaciones son muy variadas y en función de la memoria disponible. Integra una variable llamada "bandera", la cual detecta los intercambios que se realizaron. La ordenación por burbuja o “bubble sort” se basa en comparar elementos contiguos del arreglo (vector) e intercambiar sus valores si no están en orden. De este modo, los valores de mayor rango se “hunden” hacia la parte inferior del arreglo y los de menor rango “burbujean” hacia la parte superior del arreglo.
La ordenación se basa en comparar los elementos adyacentes del arreglo e intercambiar valores, si es que están desordenados.
Si:
a [0] a [1] a [2] … a [n-1]
El método comienza a comparar a [0] con a[1]; si no están en orden, los intercambia entre sí. Después sigue comparando a [1] con a [2] y si no están en orden, los intercambia. Se sigue comparando e intercambiando hasta a [n-2] con a[n-1] si están en desorden. Estas operaciones son el primer recorrido a través del arreglo. Este proceso se repite durante n-1 recorrido, teniendo en cuenta que en el recorrido “i se ha puesto el elemento de mayor rango de las posiciones “0, 1, … n-i” en la posición “n-i”. De esta forma cuando i toma el valor de n-1, el vector esta ordenado.
La ordenación se basa en comparar los elementos adyacentes del arreglo e intercambiar valores, si es que están desordenados.
Si:
a [0] a [1] a [2] … a [n-1]
El método comienza a comparar a [0] con a[1]; si no están en orden, los intercambia entre sí. Después sigue comparando a [1] con a [2] y si no están en orden, los intercambia. Se sigue comparando e intercambiando hasta a [n-2] con a[n-1] si están en desorden. Estas operaciones son el primer recorrido a través del arreglo. Este proceso se repite durante n-1 recorrido, teniendo en cuenta que en el recorrido “i se ha puesto el elemento de mayor rango de las posiciones “0, 1, … n-i” en la posición “n-i”. De esta forma cuando i toma el valor de n-1, el vector esta ordenado.
Ventajas y Desventajas.
Ventajas del método:
Fácil de comprender y programar.
Fácil de comprender y programar.
Es eficaz.
Consume menos recursos comparado con otros métodos de ordenación.
Consume menos recursos comparado con otros métodos de ordenación.
Desventajas:
Requiere muchas comparaciones
Requiere muchas lecturas/escrituras de memdsfiia
Es recursivo y su implementación no recursiva es complicada.
Es el menos eficiente de los métodos de ordenamiento.
Requiere muchas comparaciones
Requiere muchas lecturas/escrituras de memdsfiia
Es recursivo y su implementación no recursiva es complicada.
Es el menos eficiente de los métodos de ordenamiento.
Algoritmo Base
void burbujaM(int *v, int n) {
bool bandera = true;
int li = 0;
do
bool bandera = true;
int li = 0;
do
{
li++;
bandera = true;
li++;
bandera = true;
for (int i = 0; i < n - li; i++) {
if ( v[i] > v[i+1] ) { // compara los valores
intercambia los datos
int tem = v[i];
v[i] = v[i+1];
v[i+1] = tem;
bandera= false;
}
}
}
if ( v[i] > v[i+1] ) { // compara los valores
intercambia los datos
int tem = v[i];
v[i] = v[i+1];
v[i+1] = tem;
bandera= false;
}
}
}
while(!bandera);
}
}
Código en C
PARA DESCARGAR EL PROGRAMA
AQUÍ EL LINK Y ABAJO EL CÓDIGO
#include
#include
#include
main(){
float X[100], AUX;
int N, paso, j;
int bandera=1;
clrscr();
int bandera=1;
clrscr();
printf("Cuantos n£meros va a ingresar: ");
scanf("%i",&N);
for(j=0;j
scanf("%i",&N);
for(j=0;j
{
printf("Deme un numero: ");
scanf("%f",&X[j]);
}
for(paso=0;paso {
bandera=0;
for(j=0;j
{
if(X[j] {
bandera=1;
AUX=X[j];
X[j]=X[j+1];
X[j+1]=AUX;
}
}
}
printf("\nLos numeros ordenados de mayor a menor son:\n");
for(j=0;j {
printf("%.2f\n",X[j]);
}
bandera=1;
for(paso=0;paso {
bandera=0;
for(j=0;j {
if(X[j]>X[j+1])
{
bandera=1;
AUX=X[j];
scanf("%f",&X[j]);
}
for(paso=0;paso {
bandera=0;
for(j=0;j
{
if(X[j] {
bandera=1;
AUX=X[j];
X[j]=X[j+1];
X[j+1]=AUX;
}
}
}
printf("\nLos numeros ordenados de mayor a menor son:\n");
for(j=0;j {
printf("%.2f\n",X[j]);
}
bandera=1;
for(paso=0;paso {
bandera=0;
for(j=0;j {
if(X[j]>X[j+1])
{
bandera=1;
AUX=X[j];
X[j]=X[j+1];
X[j+1]=AUX;
}
}
}
printf("\ny de menor a mayor:\n");
for(j=0;j {
printf("%.2f\n",X[j]);
}
getch();
}
X[j+1]=AUX;
}
}
}
printf("\ny de menor a mayor:\n");
for(j=0;j {
printf("%.2f\n",X[j]);
}
getch();
}
Código en Java
PARA DESCARGAR EL PROGRAMA
EN EL LINK DE ABAJO
class OrdenaAlgoritmo {
public static void ordenar( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
for (int i = 0; i < arreglo.length; i++) {
++pasadas;
for (int j = 0; j < arreglo.length - 1; j++) {
++comparaciones;
if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
}
}
}
estadisticas(pasadas, comparaciones);
}
public static void ordenarMejorado( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
boolean hayCambios = true;
for (int i = 0; hayCambios ; i++) {
++pasadas;
hayCambios = false;
for (int j = 0; j < arreglo.length - 1; j++) {
++comparaciones;
if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
hayCambios = true;
}
}
}
estadisticas(pasadas, comparaciones);
}
private static void intercambiar(int [] arreglo, int a, int b) {
int tmp = arreglo[a];
arreglo[a] = arreglo[b];
arreglo[b] = tmp;
}
private static void estadisticas( int pasadas, int comparaciones) {
System.out.println( "Pasadas: " + pasadas );
System.out.println( "Comparaciones: " + comparaciones );
}
}
-----------------------------------------------------------------------------------------------------
public class OrdenaBurbuja {
public static void main (String args[]) {
int valores = {15,35,01,05,04,03,19,45,13,02,55,8,
78,997,451,546,12,16,24,103,99,784,
4541,15};
//OrdenaAlgoritmo.ordenar(valores);
OrdenaAlgoritmo.ordenarMejorado(valores);
// Mostrar arreglo.
for (int i = 0; i < valores.length ; i++)
System.out.println ( "valores["+i+"]: "+ valores[i]);
}
}
Fórmulas
Para calcular el total de comparaciones:
(n - 1 )* (n – 1) = n^2 - 2n + 1 = O(n^2)
Para calcular el total de iteraciones:
2kn - k^2 – k / 2 = 0(n^2)
Análisis de la complejidad del algoritmo
Por Tiempo:
El ordenamiento se acelera haciendo que el recorrido vaya en direcciones opuestas para que los elementos más pequeños se muevan rápidamente a la parte de superior o delantera del arreglo al mismo tiempo que los más grandes se muevan a la parte inferior o posterior del arreglo.
Por Espacio:
Requiere poco espacio adicional (un registro adicional para contener el valor temporal para intercambiar varias variables) y que es 0(n).
Por Costo:
Dependerá del número total de intercambios los cuales no deben ser mayor que la cantidad de comparaciones porque es probable que la cantidad de intercambios ocupe más tiempo de la ejecución del programa.
El ordenamiento se acelera haciendo que el recorrido vaya en direcciones opuestas para que los elementos más pequeños se muevan rápidamente a la parte de superior o delantera del arreglo al mismo tiempo que los más grandes se muevan a la parte inferior o posterior del arreglo.
Por Espacio:
Requiere poco espacio adicional (un registro adicional para contener el valor temporal para intercambiar varias variables) y que es 0(n).
Por Costo:
Dependerá del número total de intercambios los cuales no deben ser mayor que la cantidad de comparaciones porque es probable que la cantidad de intercambios ocupe más tiempo de la ejecución del programa.
Peor caso:
Es cuando se considera el mayor tiempo posible para hacer los intercambios y realizar el ordenamiento. O(nlog n)
Es cuando se considera el mayor tiempo posible para hacer los intercambios y realizar el ordenamiento. O(nlog n)
Caso probabilístico:
Dependerá del orden en que van entrando los datos, pero solo es un poco mejor al peor caso. Y sigue siendo O(n^2).
Dependerá del orden en que van entrando los datos, pero solo es un poco mejor al peor caso. Y sigue siendo O(n^2).
Función de Complejidad
La función de complejidad es cuadrática debido a que n elementos requieren n-1 recorridos para dejar el arreglo ordenado.
La formula es la siguiente:
(n - 1)* (n – 1) = n^2 - 2n + 1 = O(n^2)
Bibliografía
Estructura de datos con c y c++
Yedidyah Langsam, Moshe J. Augenstein y Aarón M. Tenenbaum
Yedidyah Langsam, Moshe J. Augenstein y Aarón M. Tenenbaum
Suscribirse a:
Entradas (Atom)