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',....]

k-1 b. 44... 35 4ª pasada 08..A[k]. 67. Este proceso se repite desde el segundo hasta el n-esimo elemento. 12. 44. 12. 35 5ª 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. 16. 08. 12. 27. 27. 12. 35. {fin del ciclo del paso 1. 15. 27. 27. Si a[k]<=aux Entonces: Hacer A[k+1]<-aux Si no Hacer A[k+1]<. 16. nos queda: Cmed = (n2+n-2)/4 Respecto al número de movimientos Knuth obtiene los siguiente: Mmin = 0 ..'e'. 35 Y así sucesivamente. 67.'i'. 08.'s'. 16. 12. 35 1ª pasada 08. Hacer A[k+1]<. puede ser calculado mediante la suma de las comparaciones mínimas y máximas divididas entre 2. 27. 27. 67. 15. 35 6ª pasada 08. 12. 16. 12. 67.3} 2. 27. 35 3ª pasada A[4] < A[3] 08 < 15 Si hay intercambio A= 08. 16.A[I] y k<.'p'. 12. 15. INSERCION (A. 67..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. Ejemplo 1: A= 15. Cmed = [(n-1) + (n2-n)/2]/2 Al hacer la operación. 27. 16. 44.A[k] y k<-. 44. 27. 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+. 12. 16. 15. 27. {fin del condicional del paso1} Prueba de escritorio: Si A= 15. A[k]<-A[k] d. 12. 67. 08. 16. 15. 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. 44. 15.'n'. 08.'g'. 44. 35 2ª pasada A[3] < A[2] 08 < 67 Si hay intercambio A= 15. 15. 35 2ª 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.'o'.. { fin del condicional del paso 1.'l'.'m'.Así se continúa y el resultado final es el arreglo ordenado : a = ['a'. 44.'t'. 27. 15. 44.. 35 Comparaciones realizadas: 1ª pasada A[2] < A[1] 67 < 15 No hay intercambio A= 15. 67. 35 3ª pasada 08.. 44. 44. Repetir mientras(aux < [k]) y (k > 1) .. aux y k son variables de tipo entero} 1. 67.. 44.I-1 a. 16.N) Insercion(A.. 44. 16. 27.Repetir con I desde 2 hasta N Hacer aux<. 12. 67.1} c. 16...'a'.'e'. 16.'r'. 12. 35 7ª pasada 08.

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

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

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

Sign up to vote on this title
UsefulNot useful