Métodos de ordenamiento: 0) Intercambio: a) Idea: El algoritmo de intercambio aunque es el más sencillo de implementar es uno de los más ineficientes en rendimiento. Se basa en la idea de buscar cada vez el menor elemento del vector y ubicarlo al principio del mismo, repitiendo este proceso cada vez con el vector sin su primer elemento (el menor del vector), hasta llegar a un vector de un solo elemento que por definición ya está ordenado. b) Ejemplo:
c) Algoritmo: En cada paso del algoritmo se compara el i/esimo elemento del vector a, con los demás elementos a[j] (j=i+1.. n) y cuando a[i] es mayor que a[j], se intercambian sus valores. Cuando se termina de recorrer el arreglo el proceso nos garantiza que en a[i] es el menor elemento del vector.
Desde i = 0 hasta (<) n-1 Desde j = i+1 hasta (<) n Si a[i] > a[j] luego intercambiar d) Eficiencia: Teniendo en cuenta que el algoritmo de ordenamiento por intercambio se realiza siempre de la misma manera independiente de los datos que estén almacenados, no existe un mejor, peor o caso promedio y su complejidad siempre será O(n 2 ). 1) Burbuja: a) Idea: La idea básica del ordenamiento de la burbuja es recorrer el conjunto de elementos en forma secuencial varias veces. Cada paso compara un elemento del conjunto con su sucesor (v[j] con v[j+1]), e intercambia los dos elementos si no están en el orden adecuado, llevando el mayor hacia abajo o al final de la lista. b) Ejemplo: n=6 elementos, ubicados en los índices 0 a 5 Tomemos como ejemplo los números: "9 6 5 8 2 1", que serán ordenados de menor a mayor. Primera vuelta: (i=0) v[0]? v[1] : ( 9 6 5 8 2 1 ) ( 6 9 5 8 2 1 ), el algoritmo compara los primeros dos elementos y los cambia porque 9 > 6 v[1]? v[2] : ( 6 9 5 8 2 1 ) v[2]? v[3] : ( 6 5 9 8 2 1 ) v[3]? v[4] : ( 6 5 8 9 2 1 ) v[4]? v[5] : ( 6 5 8 2 9 1 ) ( 6 5 9 8 2 1 ) los intercambia ( 6 5 8 9 2 1 ) los intercambia ( 6 5 8 2 9 1 ) los intercambia ( 6 5 8 2 1 9 ) el 9 está en su posición correcta v[j]? v[j+1] : (j=0,1,2,3,4) (observar hasta 4!) (j < 6-(0+1)) (j < 5)
Segunda vuelta: (i=1) v[0]? v[1] : ( 6 5 8 2 1 9 ) v[1]? v[2] : ( 5 6 8 2 1 9 ) ( 5 6 8 2 1 9 ) los intercambia ( 5 6 8 2 1 9 ), como estos elementos ya están en orden, el algoritmo no hace cambios. v[2]? v[3] : ( 5 6 8 2 1 9 ) v[3]? v[4] : ( 5 6 2 8 1 9 ) ( 5 6 2 8 1 9 ) los intercambia ( 5 6 2 1 8 9 ) el 8 ya está en su posición correcta v[j]? v[j+1] : (j=0,1,2,3) (observar hasta 3!) (j < 6-(1+1)) (j < 4) Tercera vuelta: (i=2) v[0]? v[1] :( 5 6 2 1 8 9 ) v[1]? v[2] ( 5 6 2 1 8 9 ) v[2]? v[3] ( 5 2 6 1 8 9 ) ( 5 6 2 1 8 9 ) no los intercambia ( 5 2 6 1 8 9 ) los intercambia ( 5 2 1 6 8 9 ) el 6 ya está en su posición correcta v[j]? v[j+1] : (j=0,1,2,3) (observar hasta 2!) (j < 6-(2+1)) (j < 3) Cuarta vuelta: (i=3) v[0]? v[1] :( 5 2 1 6 8 9 ) v[1]? v[2] ( 2 5 1 6 8 9 ) ( 2 5 1 6 8 9 ) los intercambia ( 2 1 5 6 8 9 ) el 5 ya está en su posición correcta v[j]? v[j+1] : (j=0,1) (observar hasta 1!) (j < 6-(3+1)) (j < 2)
Quinta vuelta: (i=4) v[0]? v[1] :( 2 1 5 6 8 9 ) ( 1 2 5 6 8 9 ) el 2 ya está en su posición correcta v[j]? v[j+1] : (j=0) (observar hasta 0!) (j < 6-(4+1)) (j < 1) Sexta vuelta: (i=5) ( 1 2 5 6 8 9 ) el 1 quedó en su posición correcta. No compara elementos porque (j=0, hasta -1!) (j < 6-(5+1)) (j < 0) FIN del proceso c) Algoritmo Desde i=0 hasta i<n Desde (j=0; j<n-(i+1) Si v[i] > v[j] luego intercambiar d) Eficiencia: Existen n-1 pasos y n-i comprobaciones en cada paso, aunque es mejor que el algoritmo de ordenamiento por intercambio. En el peor de los casos cuando los elementos están en el orden inverso, el número máximo de recorridos es n-1 y el número de intercambios o comparaciones está dado por (n-1) * (n-1) = n² - 2n + 1. La complejidad del algoritmo de la burbuja es O(n²) en el peor de los casos.
2) Por Selección: a) Idea: En cada paso, i, coloco en la posición i el menor elemento entre i y N. Para seleccionarlo busco el mínimo. Pasos: Buscar el mínimo elemento de la lista Intercambiarlo con el primero Buscar el siguiente mínimo en el resto de la lista Intercambiarlo con el Segundo, y así sucesivamente Y en general: Buscar el mínimo elemento entre una posición i y el final de la lista Intercambiar ese mínimo con el elemento de la posición i b) Ejemplo:
c) Algoritmo for(i=0 ; i<n-1 ; i++) ban=0; min=i;//min es la posición del menor, comienzo con menor = primer elemento de la lista for(j=i+1 ; j<n ; j++) //Esta es la sublista. if (v[min] > v[j]) min=j;//min ahora tiene la posición del elemento menor de la sublista ban=1;//seteamos ban a 1 para que efectue el intercambio dentro de la sublista if(ban)
aux=v[min]; v[min]=v[i]; v[i]=aux; d) Eficiencia: O(n 2 ) 3) Por Inserción: a) Idea: El ordenamiento empieza por la izquierda del array y va trabajando hacia su derecha. Aquí no selecciona el elemento más pequeño para hacer el intercambio, lo que hace es trasladar(inserta) hacia la izquierda cada elemento más pequeño que va encontrando en su camino. Este ordenamiento parte la lista en dos secciones; la mitad ordenada y la mitad desordenada. En cada vuelta del bucle exterior, el algoritmo recogerá el siguiente elemento desordenado y lo insertará en la sublista ordenada. b) Ejemplo:
Primer elemento, el 44, está ordenado respecto a sí mismo, o insertado en la sublista vacia [ ] Segundo elemento, el 55, insertado en la sublista [44] Tercer elemento, el 12, insertado en la sublista [44,55] Cuarto elemento, el 42 insertado en la sublista [12,44,55] Quinto elemento, el 94 insertado en la sublista [12,42, 44,55] Sexto elemento, el 18 insertado en la sublista [12,42, 44,55,94] Septimo elemento, el 06 insertado en la sublista [12,18, 42, 44,55,94] Ultimo elemento, el 67 insertado en la sublista [06,12,18, 42, 44,55,94] LISTA FINAL= [06,12,18, 42, 44,55,67,94] c) Algoritmo: void insercion(int v[100], int n) int i,j,elem; for (i=1;i < n; i++) elem = v[i]; for (j=i-1; j>= 0 && v[j] > elem; j--) v[j+1 = v[j]; //desplazamiento para hacer hueco en v v[j+1] = elem; //inserción de elem d) Eficiencia : O(n 2 ) e) Variante: inserción binaria (determina la posición de inserción en la sublista ordenada mediante búsqueda binaria.