Algoritmos de inserción

:
En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posición apropiada con respecto al resto de los elementos ya ordenados. Entre estos algoritmos se encuentran el de INSERCION DIRECTA, SHELL SORT, INSERCION BINARIA y HASHING.

METODO DE INSERCIÓN.
Este método toma cada elemento del arreglo para ser ordenado y lo compara con los que se encuentran en posiciones anteriores a la de él dentro del arreglo. Si resulta que el elemento con el que se está comparando es mayor que el elemento a ordenar, se recorre hacia la siguiente posición superior. Si por el contrario, resulta que el elemento con el que se está comparando es menor que el elemento a ordenar, se detiene el proceso de comparación pues se encontró que el elemento ya está ordenado y se coloca en su posición (que es la siguiente a la del último número con el que se comparó).

Procedimiento Insertion Sort
Este procedimiento recibe el arreglo de datos a ordenar a[] y altera las posiciones de sus elementos hasta dejarlos ordenados de menor a mayor. N representa el número de elementos que contiene a[]. paso 1: [Para cada pos. del arreglo] For i <- 2 to N do paso 2: [Inicializa v y j] v <- a[i] j <- i. paso 3: [Compara v con los anteriores] While a[j-1] > v AND j>1 do paso 4: [Recorre los datos mayores] Set a[j] <- a[j-1], paso 5: [Decrementa j] set j <- j-1. paso 5: [Inserta v en su posición] Set a[j] <- v. paso 6: [Fin] End. Ejemplo: Si el arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'], el algoritmo va a recorrer el arreglo de izquierda a derecha. Primero toma el segundo dato 's' y lo asigna a v y i toma el valor de la posición actual de v. Luego compara esta 's' con lo que hay en la posición j-1, es decir, con 'a'. Debido a que 's' no es menor que 'a' no sucede nada y avanza i. Ahora v toma el valor 'o' y lo compara con 's', como es menor recorre a la 's' a la posición de la 'o'; decrementa j, la cual ahora tiene la posición en dónde estaba la 's'; compara a 'o' con a[j-1] , es decir, con 'a'. Como no es menor que la 'a' sale del for y pone la 'o' en la posición a[j]. El resultado hasta este punto es el arreglo siguiente: a = ['a','o','s','r',....]

INSERCION (A.'r'. 27. 35 7ª pasada 08.'s'. 27.'g'. 27.'a'. 35 5ª pasada 08. 12. 44. 27.. 35 2ª pasada 08. 12. 12.'o'.Repetir con I desde 2 hasta N Hacer aux<.'i'. 35 3ª pasada 08.'x'] ORDENACION POR INSERCION DIRECTA Supóngase que se desea ordenar los siguientes claves del arreglo A utilizando el método de inserción directa el cual consiste en insertar un elemento del arreglo en la parte izquierda del mismo que ya se encuentra ordenada. 67. Hacer A[k+1]<. 27. 27.'p'..k-1 b.'t'. 08. 16. 16. 15. 15.A[k]. 15.3} 2.'n'. 16. 44. 16. 67. 35 3ª pasada A[4] < A[3] 08 < 15 Si hay intercambio A= 08. 67. 12. 44. Cmed = [(n-1) + (n2-n)/2]/2 Al hacer la operación.A[I] y k<. puede ser calculado mediante la suma de las comparaciones mínimas y máximas divididas entre 2.. 44.. 16. 12. Este proceso se repite desde el segundo hasta el n-esimo elemento. 44.N) Insercion(A.N) {El algoritmo ordena los elementos del arreglo utlizando el método de inserción directa A es un arreglo de N elementos} {I. 67. 44...Así se continúa y el resultado final es el arreglo ordenado : a = ['a'. 12. A[k]<-A[k] d. 44. 08. 15. 35 4ª pasada 08. 35. 27. 16. 35 Y así sucesivamente. 27. 12. 67.. {fin del condicional del paso1} Prueba de escritorio: Si A= 15.'e'.A[k] y k<-. 16. 15. 67. 16. { fin del condicional del paso 1.. 44. 44. 27. 12. 08.. 15. Ejemplo 1: A= 15. Repetir mientras(aux < [k]) y (k > 1) . {fin del ciclo del paso 1. 27.'m'. 67. 67. 16. 12. 35 2ª pasada A[3] < A[2] 08 < 67 Si hay intercambio A= 15.. 35 6ª pasada 08. 27. 16. 15. 12. 44. 44. 15. 35 Comparaciones realizadas: 1ª pasada A[2] < A[1] 67 < 15 No hay intercambio A= 15. Si a[k]<=aux Entonces: Hacer A[k+1]<-aux Si no Hacer A[k+1]<.'l'. 08. 12. 12.. El número máximo de comparaciones y movimientos se produce cuando los elementos del arreglo están en orden inverso Cmax = 1+2+3+. aux y k son variables de tipo entero} 1. 27. 35 1ª pasada 08.+(n-1) = n*(n-1)/2 Cmax= (n2-n)/2 El número de comparaciones promedio que es cuando los elementos aparecen en el arreglo en forma aleatoria. 67. 67. 16.'e'..1} c. nos queda: Cmed = (n2+n-2)/4 Respecto al número de movimientos Knuth obtiene los siguiente: Mmin = 0 . 16.. 44. 67..I-1 a. 67 ANALISIS DE EFICIENCIA DEL METODO DE INSERCION DIRECTA En general afirmar que si el arreglo se encuentra ordenado se efectúan como máximo n-1 comparaciones y o movimientos entre elementos Cmin = n-1.

x (* asignamos x al centinela *) j <-.Mmed = (n2-n)/4 Mmax = (n2-n)/2 El tiempo necesario para ejecutar el algoritmo es proporcionar a n2.j: 0. O(n2).A[i] A[0] <-.n hacer x <-.j-1 (* pasamos a otro elemento *) fin_mientras A[j+1] <-.n] de T Salida A Variables x: T i...n Inicio desde i <-.A[j] (* desplazamos hacia la izquierda *) j <-. Ejemplo 2: Entrada A: array [0.2 hasta i <-. el método de inserción directa se comporta mejor que el método de intercambio directo analizado anteriormente. A pesar de ser un método ineficiente y recomendable solo cuando n es pequeña.x fin_desde fin .i-1 (* empezar a comparar por el anterior *) mientras x < A[j] hacer A[j+1] <-.

j ). }while(nlargo). . int der ) { int i.n. j. } if( i <= j ) { aux = A[i]. do{ cout<>n.h´ using namespace std. } while( (x izq) ) { j±. x = A[ (izq + der) /2 ]. j±. i. i = izq. if(nlargo) cout< a 0 y < a ³<<largo<<endl. if( izq < j ) quicksort( A.ejemplo 2: 1. izq. if( i < der ) quicksort( A. //Quick Sort #include #define largo 100 #include´leearreglo. } }while( i <= j ). void quicksort(int A[]. aux. A[i] = A[j]. der ). i++. do{ while( (A[i] < x) && (j <= der) ) { i++. j = der. A[j] = aux.int izq. x . } void main () { int A[largo].

A). quicksort(A.A). } .0.leeCadena(n. muestraCadena(n.n-1).