// http://www.programmingsimplified.com/c/source-code/c-program-bubble-sort
// https://en.wikipedia.org/wiki/Bubble_sort
/* Bubble sort code (variante) */
#include <stdio.h>

#define FALSE	0
#define TRUE	1
#define MIDA	100

int main() {
	int v[MIDA], n, i, j, k, aux, cambios;

	printf("Numero de elementos\n"); // 4
	scanf("%d", &n);
	printf("Intro %d enteros\n", n); // 3 4 2 1
	for (i = 0; i < n; i++) {
		scanf("%d", &v[i]);
	}
	printf("\n");

	cambios = TRUE;
	for (i=0; i < (n-1) && cambios; i++) {
		cambios = FALSE;
		for (j=0; j < n-i-1; j++) {
			if (v[j] > v[j+1]) {
				cambios = TRUE;
				aux	= v[j];
				v[j]	= v[j+1];
				v[j+1]	= aux;
			}
			for (k=0; k<n; k++) printf("%d ", v[k]); printf("\n");
		}
		printf("%d ultimos elementos ordenados.\n\n", i+1);
	}

	if (!cambios) {
		printf("En la ultima pasada no hecho ningun intercambio.\n"
				"Por lo tanto...\n");
	}

	printf("Todos ordenados:\n");
	for (k=0; k<n; k++) printf("%d ", v[k]); printf("\n");
}

/*
 * Si elimino la linea donde inicializo cambios a TRUE,
 * gcc -Wall no detecta que cambios no ha sido inicializada.
 * Con -O2 se detecta que en el "if (!cambios)" no ha sido inicializada.
 * 	pero si comento todo el if no detecta que en el
	"for (i=0; i < (n-1) && cambios; i++)" no ha sido inicializada.
 * Pero, con -Og si que detecta los dos casos. :-)
 */

/*
 * https://stackoverflow.com/questions/17705880/gcc-failing-to-warn-of-uninitialized-variable
 * "You need to enable optimizations of some kind. Recompile your example with
 * -O2, for example, and the warning will appear.
 * Since this requires analysis of code paths and it's a rather expensive
 * computation, GCC only enables it when asked to optimize code."
 *
 * Añadiendo el -O2 hace que el warning aparezca
 * gcc -o t3v_sort_bubble_v2 t3v_sort_bubble_v2.c -Wall -O2
 * [...]
 * t3v_sort_bubble_v2.c:35:5: warning: ‘cambios’ may be used uninitialized in this function [-Wmaybe-uninitialized]
 * [...]
 *
 * WARNING: Debugar un codigo con optimizaciones de compilador puede hacer
 * que parezca que el programa no se ejecuta como seria esperado.
 *
 * para mas info sobre niveles de optimizacion:
 * https://www.rapidtables.com/code/linux/gcc/gcc-o.html
 * 	y
 * man gcc
 * 	/Options That Control Optimization
 */

