Es probablemente el mtodo ms conocido entre los estudiantes y principiantes. Es de fcil comprensin y programacin pero es probablemente el menos eficiente que existe. Este mtodo est dentro de la categora de los mtodos de ordenacin por intercambio. Si se hace un estudio de la eficiencia de acuerdo al nmero de comparaciones que se realizan con ste mtodo se llegar a:
C = (n 2 n) El nmero de intercambios es cero en el mejor de los casos, en una lista ya ordenada. Los nmeros de intercambios para el caso medio y para el caso peor son respectivamente:
M prom = (n 2 n) M max = 3/2 (n 2 n) Por lo anterior se dice que el mtodo de Ordenamiento de la Burbuja es de orden n 2 (O(n 2 )). El algoritmo en C es el siguiente:
Burbuja(a,n) { int i,k,aux; for (k=0; k<n-1; k++) for (i=n-2; i>=k; i--) if(a[i] > a[i+1]) { aux = a[i]; a[i] = a[i+1]; a[i+1] = aux; }} El ordenamiento por seleccin (Selection Sort en ingls) es un algoritmo de ordenamiento que requiere O operaciones para ordenar una lista de n elementos. Su funcionamiento es el siguiente: Buscar el mnimo elemento de la lista Intercambiarlo con el primero Buscar el siguiente mnimo en el resto de la lista Intercambiarlo con el segundo Y en general: Buscar el mnimo elemento entre una posicin i y el final de la lista Intercambiar el mnimo con el elemento de la posicin i De esta manera se puede escribir el siguiente pseudocdigo para ordenar una lista de n elementos indexados desde el 1: Ejemplo de seleccin. for (i=0; i<TAM - 1; i++) pos_menor = Menor (A, TAM, i); temp = A[i]; A[i] = A [pos_menor]; A [pos_menor] = temp;
Ordenamiento por insercion El ordenamiento por insercin (insertion sort en ingls) es una manera muy natural de ordenar para un ser humano, y puede usarse fcilmente para ordenar un mazo de cartas numeradas en forma arbitraria. Requiere O(n) operaciones para ordenar una lista de n elementos. Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Despus, cuando hay k elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara con todos los elementos ya ordenados, detenindose cuando se encuentra un elemento menor (todos los elementos mayores han sido desplazados una posicin a la derecha) o cuando ya no se encuentran elementos (todos los elementos fueron desplazados y este es el ms pequeo). En este punto se inserta el elemento k+1 debiendo desplazarse los dems elementos. Ejemplo en C: void ordIns(int vector[], int n) { int i, j, indice;
for (i=1; i < n; i++) { indice = vector[i];
for (j=i-1;j >= 0 && vector[j] > indice;j--) { vector[j + 1] = vector[j]; } vector[j+1] = indice; }} Ordenamiento Quicksort El ordenamiento rpido (quicksort en ingls) es un algoritmo creado por el cientfico britnico en computacin C. A. R. Hoare basado en la tcnica de divide y vencers, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
El algoritmo trabaja de la siguiente forma: Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. Resituar los dems 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 pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementacin deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponder en la lista ordenada. La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha. Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados. Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el pivote elegido. En el mejor caso, el pivote termina en el centro de la lista, dividindola en dos sublistas de igual tamao. En este caso, el orden de complejidad del algoritmo es O(nlog n). En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de O(n). El peor caso depender de la implementacin del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi 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 ordenado, siempre va a generar a su izquierda un array vaco, lo que es ineficiente. Ejemplo: int colocar(int *v, int b, int t) { int i; int pivote, valor_pivote; int temp;
pivote = b; valor_pivote = v[pivote]; for (i=b+1; i<=t; i++){ if (v[i] < valor_pivote){ pivote++; temp=v[i]; v[i]=v[pivote]; v[pivote]=temp;