2010-12-03 17 views
5

Tuve una discusión con un amigo acerca de la burbuja real de los siguientes dos algoritmos, y sobre cuál es mejor, sin mencionar cuál es el mío, solo quiero escuchar sus respuestas sobre estas dos preguntas acerca de esos dos algoritmos (escrito en C++)¿Cuál es el tipo de burbuja real y cuál es mejor?

1-¿cuál es el tipo de burbuja real?
2-cuál es mejor?

aquí son los dos algoritmos:

// Number one : 
void BubbleSort(int Arr[], int size) 
{ for (int i=0;i<size-1;i++) 
     for (int j=i+1;j<size;j++) 
      if (Arr[i]>Arr[j]) 
      { int temp = Arr[i]; 
       Arr[i] = Arr[j]; 
       Arr[j] = temp; 
}   } 

// Number two : 
void BubbleSort(int Arr[], int size) 
{ for (int i=0;i<size-1;i++) 
     for (int j=0;j<size-1;j++) 
      if (Arr[j]>Arr[j+1]) 
      { int temp = Arr[j]; 
       Arr[j] = Arr[j+1]; 
       Arr[j+1] = temp; 
}   } 
+3

Debe tenerse en cuenta que la ordenación de burbujas nunca debe usarse en ningún tipo de código de producción, ya que simplemente apesta en comparación con otros ordenamientos basados ​​en comparación como ordenación por inserción, que es tan fácil de implementar pero supera la clasificación de burbujas en casi no todos) casos. Incluso voy tan lejos y digo que el tipo de burbuja no debería enseñarse más. – helpermethod

+2

Python está en el pasillo, segunda puerta a la derecha. En serio: use la sangría C; no lo disfraces – pmg

Respuesta

11

número dos está más cercano al real. Todas las comparaciones deben ser entre elementos adyacentes.

Pero el verdadero ordenamiento de burbuja tomaría un bucle while en lugar de un bucle externo for, y el bucle while ejecutaría de nuevo sólo si los elementos tuvieron que ser cambiado en la última pasada, así:

void BubbleSort(int Arr[], int size) 
{ 
    bool swapped; 
    do { 
     swapped = false; 
     for (int j=0;j<size-1;j++) 
      if (Arr[j]>Arr[j+1]) { 
       int temp = Arr[j]; 
       Arr[j] = Arr[j+1]; 
       Arr[j+1] = temp; 
       swapped = true; 
      } 
    } while (swapped); 
} 
+3

Creo que necesita reinicializar intercambiado a falso después de cada pase, ¿no? –

+0

Sí, se perdió eso. Fijo. –

+0

@userunknown Tienes razón. Fijo. –

1

el pseudocódigo para la burbuja de bucle anidado tipo es:

procedure bubbleSort(A : list of sortable items) 
    n := length(A)-1 
    for(i=0; i<= n; i++) 
    for(j=n; j>i; j--) 
     if A[j-1] > A[j] then 
      swap (A[j-1], A[j]) 
     end if 
    end for 
    end for 
end procedure 

Esto significa que la primera es la más cercana debido a que el bucle interior sólo itera sobre elementos después i. El segundo método que mostró tiene un bucle interno que itera sobre todos los elementos, a pesar de que los elementos antes ya se han ordenado, por lo que no hay necesidad de perder tiempo en ellos.

Eso significa que el primer método también es mejor.

+2

Pero en su primer método, está comparando Arr [i] y Arr [j], no Arr [j-1] y Arr [j] –

+0

+1 para publicar realmente un tipo de burbuja. –

1

La respuesta a la pregunta n. ° 2: tampoco es "mejor". Ambos son algoritmos de ordenamiento O (n^2) (que son terribles). Además de una introducción a los algoritmos de clasificación, Bubble Sort es inútil.

Cuestiones relacionadas