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

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

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

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

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

Sign up to vote on this title
UsefulNot useful