Introduccion al Analisis y Diseño de Algoritmos Logica y Analisis de Algoritmos Francisco Lambert 2010-1
Analisis de Algoritmos ¿Que es un Algoritmo ? ¿Que es el Analisis de los algoritmos? ¿Cual es el Sentido de Analizar Algoritmos?
Analisis de Algoritmos Un algoritmo es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permiten realizar una actividad mediante pasos sucesivos que no generen dudas a quien lo  ejecute .
Analisis de Algoritmos El Analisis de Algoritmos estudia, desde un punto de vista teorico , los recursos computacionales que nesecita la ejecucion de un programa de ordenador, es decir, su eficiencia .
Analisis de Algoritmos ¿Cual es el Sentido de estudiar la eficiencia de los algoritmos? … Poder tener un mayor nivel de comprension de la realidad , para asi comprender la barrera entre lo factible y lo imposible .
Analisis de Algoritmos Ejemplo : Los algoritmos de Ordenacion . El tiempo de ejecucion dependera del tamaño del conjunto de datos a ordenar . Objetivo : Parametrizar el tiempo de ejecucion en funcion del tamaño de datos, intentando buscar una cota superior que nos sirva de garantia .
Analisis de Algoritmos Entonces, ¿Podemos comparar distintos algoritmos para saber cual de ellos se comporta de mejor manera frente a un determinado problema?
Analisis de Algoritmos Como en todo orden de cosas, existen distintos casos en los que puedo “evaluar” un algoritmo . Estos casos son intuitivos , y corresponden a una forma natural de analisis, analisis por casos.
Analisis de Algoritmos Suponiendo que nuestro algoritmo para llegar a la universidad desde el hogar sea(a grandes rasgos) : despertar->ducharnos->vestirnos->desayunar->caminar al paradero->esperar la micro->llegar al metro->llegar a la u
Analisis de Algoritmos Este algoritmo de acercamiento a la universidad posee muchas variables que pueden, de cierta manera, condicionar la respuesta que obtendremos, es decir, el tiempo de demora en el viaje a la universidad.
Analisis de Algoritmos Muchos de nosotros hemos tenido dias malos, donde el agua caliente en la mañana no funciona, se nos fue la carga del pase, se nos olvido el libro que tenemos que devolver en la u o nos subimos a la micro equivocada. Bien, eso seria entonces...
Analisis del Peor Caso Sea T(n) el tiempo MAXIMO necesario para un problema de tamaño n . Cuando este tiempo sea Maximo estaremos en presencia del Peor Caso del algoritmo . Es decir , el caso descrito anteriormente (cuando se nos descargaba el pase... etc)
Analisis de Casos ¿Cual es el tiempo que nesecitaria un algoritmo concreto? Varia en funcion del ordenador que utilicemos . Varia en funcion del compulador que seleccionemos . Varia en funcion de nuestra habilidad de programacion.
Analisis de Casos Idea : Ignorar las constantes que dependen del contexto .  Solucion : Fijarse en el crecimiento de T(n) cuando
Analisis de Casos
Analisis de Casos En la practica, es posible que un algoritmo mas ineficiente pueda resultar mas adecuado para resolver un problema real ya que hay que tener en cuenta otros aspectos ademas de la eficiencia .
Analisis de Casos
Analisis de Casos
Analisis de Casos
Ejemplo: Algoritmo de ordenación por inserción  void OrdenarInsercion (double v[], int N)  {  int i, j;  double tmp;  for (i=1; i<N; i++) {  tmp = v[i];  for (j=i; (j>0) && (tmp<v[j-1]); j--)  v[j] = v[j-1];  v[j] = tmp;  }  }
Analisis de Casos Peor Caso : Vector inivialmente ordenado alreves Caso Promedio : Con todas las permutciones igualmente probables  ¿Es Eficiente el algoritmo de ordenacion por insercion ? Si, para casos de n pequeño. NO para n grande.
Analisis de Casos Para algunos algoritmos, diferentes entradas (inputs) para un tamaño dado pueden requerir diferentes cantidades de tiempo.  Por ejemplo, consideremos el problema de encontrar la posición particular de un valor  K, dentro de un arreglo de  n elementos. (suponiendo que sólo ocurre una vez).
Analisis de Casos En cambio, cuando un algoritmo se ejecuta muchas veces en muchos tipos de entrada, estamos interesados en el comportamiento promedio o típico. Desafortunadamente, esto supone que  sabemos cómo están  distribuidos los datos. Si conocemos la distribución de los datos, podemos sacar provecho de esto, para un mejor análisis y diseño del algoritmo. Por otra parte, si no  conocemos la distribución, entonces lo mejor es considerar el peor de los casos.
Resolucion de Recurrencias Existen diversas tecnicas y trucos para el desarrollo y resolucion de las recurrencias. Metodo de Sustitucion:  1.-Adivinar la forma de la solución.  2.-Demostrar por inducción.  3.-Resolver las constantes.
Resolucion de Recurrencias
Resolucion de Recurrencias
Resolucion de Recurrencias
Resolucion de Recurrencias
Resolucion de Recurrencias
Resolucion de Recurrencias
Resolucion de Recurrencias
Teorema Maestro θ(orden exacto), O (orden superior), Ω(orden inferior),(Notacion de Landau)
Teorema Maestro Ejercicios 1. T (n)=3T (n/2)+ n^2 2. T (n)=4T (n/2)+ n^2 3. T (n)= T (n/2)+2^n 4. T (n)=2nT (n/2)+ n^n 5. T (n)=16T (n/4)+ n 6. T (n)=2T (n/2)+ n log n 7. T (n)=2T (n/2)+ n/ logn 8. T (n)=2T (n/4)+ n^0.51 9. T (n)=0.5T (n/2)+1/n 10. T (n)=16T (n/4)+ n! 11. T (n)=√(2)*T(n/2)+log n 12. T (n)=3T (n/2)+ n 13. T (n)=3T (n/3)+ √n 14. T (n)=4T (n/2)+ cn 15. T (n)=3T (n/4)+ n log n 16. T (n)=3T (n/3)+ n/2 17. T (n)=6T (n/3)+ n^2 log n 18. T (n)=4T (n/2)+ n/ log n 19. T (n)=64T (n/8)− n^2 log n 20. T (n)=7T (n/3)+ n^2 21. T (n)=4T (n/2)+log n 22. T (n)= T (n/2)+ n(2 − cos n)
Teorema Maestro Ejercicios
Teorema Maestro Ejercicios
Algoritmos de Ordenamiento Dado un conjunto de n elementos (a1,a2,...,an) y una relacion de orden total entre dichos elementos (> por ejemplo) el problema de ordenar el conjunto de elementos se reduce a realizar permutaciones sobre el conjunto numerico con tal de ordenar dichos elementos en forma de que cumplan la relacion de orden total definida anteriormente. Aunque tanto el tipo y tamaño de los elementos como el dispositivo en donde se  encuentran almacenados pueden influir en el método que utilicemos para ordenarlos, en este tema vamos a solucionar el caso en que los elementos son  números enteros y se encuentran almacenados en un vector.
Algoritmos de Ordenamiento Existen muchos algoritmos de ordenamientos. MUCHOS. Algunos de los mas conocidos son Bubble sort, Insertion sort  , Shell sort, Merge sort , Heapsort , Quicksort , Counting Sort , Bucket sort , Radix sort ,  Distribution sort , etc etc etc De momento, estudiaremos Mergesort (ordenamiento mediante Mezcla) y ShellSort (derivacion de InsertSort).
Ordenando por Mezcla o MergeSort es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás. Es de complejidad O(n log n). La Ordenación por fusión, consiste en: Dado un vector T[1...n] de n elementos dotados de una relación de orden total, se trata de ordenar de forma creciente esos elementos. Para ello, se seguirán una serie de pasos, tales como : Dividir el vector en dos mitades  Ordenar esas dos mitades recursivamente Fusionarlas en un solo vector ordenado En consecuencia, podemos decir que la ordenacion por fusión es un algoritmo recursivo que irá rompiendo recursivamente en trozos el vector a ordenar hasta que éstos sean suficientemente pequeños (de 1 unidad) y empezar a fusionarlos (unir los vectores, deshaciendo la recursividad) de forma ordenada.
Ordenando por Mezcla o MergeSort algoritmo insertSort( A : lista de elementos ordenables ) para i=1 hasta longitud(A) hacer index=A[i] j=i-1 mientras j>=0 y A[j]>index hacer A[j + 1] = A[j] j = j - 1 fin mientras A[j + 1] = index fin para fin algoritmo
Ordenando Shell o ShellSort Tomemos un arreglo inicial con los datos [ 74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30 ] . Shell nos propone que hagamos sobre el arreglo una serie de ordenaciones basadas en la inserción directa, pero dividiendo el arreglo original en varios sub-arreglo tales que cada elemento esté separado  k  elementos del anterior (a esta separación a menudo se le llama  sa lto  o  gap )... Se debe empezar con  k=n/2 , siendo n el número de elementos de arreglo, y utilizando siempre la división entera.... después iremos variando k haciéndolo más pequeño mediante sucesivas divisiones por 2, hasta llegar a k=1. Pero vamos a ello... En nuestro ejemplo, n=11 (porque hay 11 elementos). Así que k=n/2=11/2=5 (division entera )
Ordenando Shell o ShellSort Empezamos con k=5. Así pues, vamos a dividir nuestro arreglo original en 5 sub-arreglo, en los cuales, sus elementos estarán separados por 5 lugares del arreglo original (el  salto  o  gap  es 5). Vamos a hacerlo con colores. Tomamos el primer elemento (el 74) contamos 5 lugares y tomamos también otro elemento (el 97) volvemos a contar 5 y tomamos otro (el 30) y acabamos porque se nos acaba el arreglo. El primer sub-arreglo con k=5 es el formado por 74, 97 y 30. Vamos a pintarlos en rojo [ 74 , 14, 21, 44, 38,   97 , 11, 78, 65, 88,  30 ]
Ordenando Shell o ShellSort Ahora, ordenaremos los elementos del sub-arreglo rojo pero sólo entre ellos, utilizando el algoritmo de Inserción directa.   30 , 14, 21, 44, 38,  74 , 11, 78, 65, 88,   97   Fíjate qué curioso. El 30, un elemento relativamente pequeño se ha ido hacia el principio y el 97 hacia el final... ¡pero dando  saltos  ( gap )   de 5 en 5 lugares! Cada uno ha avanzado en  saltos  de 5 hacia una posición cercana a su ubicación definitiva.
Ordenando Shell o ShellSort El 30, un elemento relativamente pequeño se ha ido hacia el principio y el 97 hacia el final... ¡pero dando  saltos  ( gap )   de 5 en 5 lugares! Cada uno ha avanzado en  saltos  de 5 hacia una posición cercana a su ubicación definitiva. Formemos ahora otro sub-arreglo con salto k=5... partiendo del segundo elemento (el 14) y contando 5 (tomamos también el 11) y ya está, porque se acaba el arreglo.   30 ,  14 , 21, 44, 38,   74 ,  11 , 78, 65, 88,  97
Ordenando Shell o ShellSort Ordenando la parte verde con InsertSort tenemos ahora   30 ,  11 ,  21 ,  44 ,  38 ,   74 ,  14 ,  78 ,  65 ,  88 ,  97 Ordenando de pasada la parte rosada que se mantiene igual , lo mismo ocurre con el naranjo y el celeste !. Hemos formado 5 sub-arreglos en los cuales los elementos están separados por 5 lugares (porque k=5). Hemos ordenado cada sub-arreglo por separado utilizando inserción directa, y hemos logrado que cada elemento se dirija hacia su ubicación definitiva en pasos de 5 lugares. Por supuesto, no hemos terminado todavía, pero resulta evidente que algunos elementos, como el 30, el 97 o el 11 han dado un gran salto y que no deben andar muy lejos de su sitio final.
Ordenando Shell o ShellSort Decimos ahora que el arreglo está 5-ordenado. Para continuar con el algoritmo, debemos ir reduciendo progresivamente k dividiéndolo sucesivamente por 2 y k-ordenando los sub-arreglos que nos salgan (recuerda que nos salen k sub-arreglo). Cuando lleguemos a k=1 habremos terminado.   Pero de momento, nuestra k valía 5, así que ahora k←k/2=5/2=2   Nuestra nueva k vale 2. Repetimos todo el tinglado, pero ahora nos saldrán 2 sub-arreglo cuyos elementos están separados por 2 lugares.
Ordenando Shell o ShellSort Decimos ahora que el arreglo está 5-ordenado. Para continuar con el algoritmo, debemos ir reduciendo progresivamente k dividiéndolo sucesivamente por 2 y k-ordenando los sub-arreglos que nos salgan (recuerda que nos salen k sub-arreglo). Cuando lleguemos a k=1 habremos terminado.   Pero de momento, nuestra k valía 5, así que ahora k←k/2=5/2=2   Nuestra nueva k vale 2. Repetimos todo el tinglado, pero ahora nos saldrán 2 sub-arreglo cuyos elementos están separados por 2 lugares.
Ordenando Shell o ShellSort El primero (en marrón) y el segundo (en verde): 30 ,  11 ,  21 ,  44 ,  38 ,  74 ,  14 ,  78 ,  65 ,  88 ,  97 Ahora, cada número está mucho más cerca de su posición definitiva... El arreglo está 2-ordenado... pero sigue también 5-ordenado. No hemos perdido el trabajo que hicimos cuando k era 5.   Finalmente, calculamos un nuevo k dividiendo el que tenemos entre 2. k←k/2=2/2=1 Hemos llegado a k=1. Cuando k es 1 sólo podemos obtener 1 sub-arreglo cuyos elementos están separados 1 posición: el propio arreglo original. Dicho de otra manera... cuando k es 1, el algoritmo de Shell se comporta exactamente igual que el de inserción directa sobre todo el arreglo.
Ordenando Shell o ShellSort Sin embargo, las k-ordenaciones que hemos hecho (con k=5 y k=2) han hecho que cada elemento se aproximase con saltos de 5 y luego de 2 posiciones hacia su ubicación definitiva. Ahora que k=1 y que vamos a aplicar el algoritmo de inserción directa tal cual, haremos muchas menos comparaciones e intercambios que si lo hubiéramos aplicado con en arreglo tal como lo teníamos al empezar. El algoritmo de inserción directa se comporta tanto mejor cuanto más cerca está cada elemento de su sitio definitivo.   Finalmente, el arreglo queda de ésta manera:   11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97   Cada elemento descolocado ha tenido que moverse pocos lugares. Muchos de ellos ni siquiera se han movido.

Jflambert lyada - ayudantia matematicas discretas

  • 1.
    Introduccion al Analisisy Diseño de Algoritmos Logica y Analisis de Algoritmos Francisco Lambert 2010-1
  • 2.
    Analisis de Algoritmos¿Que es un Algoritmo ? ¿Que es el Analisis de los algoritmos? ¿Cual es el Sentido de Analizar Algoritmos?
  • 3.
    Analisis de AlgoritmosUn algoritmo es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permiten realizar una actividad mediante pasos sucesivos que no generen dudas a quien lo ejecute .
  • 4.
    Analisis de AlgoritmosEl Analisis de Algoritmos estudia, desde un punto de vista teorico , los recursos computacionales que nesecita la ejecucion de un programa de ordenador, es decir, su eficiencia .
  • 5.
    Analisis de Algoritmos¿Cual es el Sentido de estudiar la eficiencia de los algoritmos? … Poder tener un mayor nivel de comprension de la realidad , para asi comprender la barrera entre lo factible y lo imposible .
  • 6.
    Analisis de AlgoritmosEjemplo : Los algoritmos de Ordenacion . El tiempo de ejecucion dependera del tamaño del conjunto de datos a ordenar . Objetivo : Parametrizar el tiempo de ejecucion en funcion del tamaño de datos, intentando buscar una cota superior que nos sirva de garantia .
  • 7.
    Analisis de AlgoritmosEntonces, ¿Podemos comparar distintos algoritmos para saber cual de ellos se comporta de mejor manera frente a un determinado problema?
  • 8.
    Analisis de AlgoritmosComo en todo orden de cosas, existen distintos casos en los que puedo “evaluar” un algoritmo . Estos casos son intuitivos , y corresponden a una forma natural de analisis, analisis por casos.
  • 9.
    Analisis de AlgoritmosSuponiendo que nuestro algoritmo para llegar a la universidad desde el hogar sea(a grandes rasgos) : despertar->ducharnos->vestirnos->desayunar->caminar al paradero->esperar la micro->llegar al metro->llegar a la u
  • 10.
    Analisis de AlgoritmosEste algoritmo de acercamiento a la universidad posee muchas variables que pueden, de cierta manera, condicionar la respuesta que obtendremos, es decir, el tiempo de demora en el viaje a la universidad.
  • 11.
    Analisis de AlgoritmosMuchos de nosotros hemos tenido dias malos, donde el agua caliente en la mañana no funciona, se nos fue la carga del pase, se nos olvido el libro que tenemos que devolver en la u o nos subimos a la micro equivocada. Bien, eso seria entonces...
  • 12.
    Analisis del PeorCaso Sea T(n) el tiempo MAXIMO necesario para un problema de tamaño n . Cuando este tiempo sea Maximo estaremos en presencia del Peor Caso del algoritmo . Es decir , el caso descrito anteriormente (cuando se nos descargaba el pase... etc)
  • 13.
    Analisis de Casos¿Cual es el tiempo que nesecitaria un algoritmo concreto? Varia en funcion del ordenador que utilicemos . Varia en funcion del compulador que seleccionemos . Varia en funcion de nuestra habilidad de programacion.
  • 14.
    Analisis de CasosIdea : Ignorar las constantes que dependen del contexto . Solucion : Fijarse en el crecimiento de T(n) cuando
  • 15.
  • 16.
    Analisis de CasosEn la practica, es posible que un algoritmo mas ineficiente pueda resultar mas adecuado para resolver un problema real ya que hay que tener en cuenta otros aspectos ademas de la eficiencia .
  • 17.
  • 18.
  • 19.
  • 20.
    Ejemplo: Algoritmo deordenación por inserción void OrdenarInsercion (double v[], int N) { int i, j; double tmp; for (i=1; i<N; i++) { tmp = v[i]; for (j=i; (j>0) && (tmp<v[j-1]); j--) v[j] = v[j-1]; v[j] = tmp; } }
  • 21.
    Analisis de CasosPeor Caso : Vector inivialmente ordenado alreves Caso Promedio : Con todas las permutciones igualmente probables ¿Es Eficiente el algoritmo de ordenacion por insercion ? Si, para casos de n pequeño. NO para n grande.
  • 22.
    Analisis de CasosPara algunos algoritmos, diferentes entradas (inputs) para un tamaño dado pueden requerir diferentes cantidades de tiempo. Por ejemplo, consideremos el problema de encontrar la posición particular de un valor K, dentro de un arreglo de n elementos. (suponiendo que sólo ocurre una vez).
  • 23.
    Analisis de CasosEn cambio, cuando un algoritmo se ejecuta muchas veces en muchos tipos de entrada, estamos interesados en el comportamiento promedio o típico. Desafortunadamente, esto supone que sabemos cómo están distribuidos los datos. Si conocemos la distribución de los datos, podemos sacar provecho de esto, para un mejor análisis y diseño del algoritmo. Por otra parte, si no conocemos la distribución, entonces lo mejor es considerar el peor de los casos.
  • 24.
    Resolucion de RecurrenciasExisten diversas tecnicas y trucos para el desarrollo y resolucion de las recurrencias. Metodo de Sustitucion: 1.-Adivinar la forma de la solución. 2.-Demostrar por inducción. 3.-Resolver las constantes.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
    Teorema Maestro θ(ordenexacto), O (orden superior), Ω(orden inferior),(Notacion de Landau)
  • 33.
    Teorema Maestro Ejercicios1. T (n)=3T (n/2)+ n^2 2. T (n)=4T (n/2)+ n^2 3. T (n)= T (n/2)+2^n 4. T (n)=2nT (n/2)+ n^n 5. T (n)=16T (n/4)+ n 6. T (n)=2T (n/2)+ n log n 7. T (n)=2T (n/2)+ n/ logn 8. T (n)=2T (n/4)+ n^0.51 9. T (n)=0.5T (n/2)+1/n 10. T (n)=16T (n/4)+ n! 11. T (n)=√(2)*T(n/2)+log n 12. T (n)=3T (n/2)+ n 13. T (n)=3T (n/3)+ √n 14. T (n)=4T (n/2)+ cn 15. T (n)=3T (n/4)+ n log n 16. T (n)=3T (n/3)+ n/2 17. T (n)=6T (n/3)+ n^2 log n 18. T (n)=4T (n/2)+ n/ log n 19. T (n)=64T (n/8)− n^2 log n 20. T (n)=7T (n/3)+ n^2 21. T (n)=4T (n/2)+log n 22. T (n)= T (n/2)+ n(2 − cos n)
  • 34.
  • 35.
  • 36.
    Algoritmos de OrdenamientoDado un conjunto de n elementos (a1,a2,...,an) y una relacion de orden total entre dichos elementos (> por ejemplo) el problema de ordenar el conjunto de elementos se reduce a realizar permutaciones sobre el conjunto numerico con tal de ordenar dichos elementos en forma de que cumplan la relacion de orden total definida anteriormente. Aunque tanto el tipo y tamaño de los elementos como el dispositivo en donde se encuentran almacenados pueden influir en el método que utilicemos para ordenarlos, en este tema vamos a solucionar el caso en que los elementos son números enteros y se encuentran almacenados en un vector.
  • 37.
    Algoritmos de OrdenamientoExisten muchos algoritmos de ordenamientos. MUCHOS. Algunos de los mas conocidos son Bubble sort, Insertion sort , Shell sort, Merge sort , Heapsort , Quicksort , Counting Sort , Bucket sort , Radix sort , Distribution sort , etc etc etc De momento, estudiaremos Mergesort (ordenamiento mediante Mezcla) y ShellSort (derivacion de InsertSort).
  • 38.
    Ordenando por Mezclao MergeSort es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás. Es de complejidad O(n log n). La Ordenación por fusión, consiste en: Dado un vector T[1...n] de n elementos dotados de una relación de orden total, se trata de ordenar de forma creciente esos elementos. Para ello, se seguirán una serie de pasos, tales como : Dividir el vector en dos mitades Ordenar esas dos mitades recursivamente Fusionarlas en un solo vector ordenado En consecuencia, podemos decir que la ordenacion por fusión es un algoritmo recursivo que irá rompiendo recursivamente en trozos el vector a ordenar hasta que éstos sean suficientemente pequeños (de 1 unidad) y empezar a fusionarlos (unir los vectores, deshaciendo la recursividad) de forma ordenada.
  • 39.
    Ordenando por Mezclao MergeSort algoritmo insertSort( A : lista de elementos ordenables ) para i=1 hasta longitud(A) hacer index=A[i] j=i-1 mientras j>=0 y A[j]>index hacer A[j + 1] = A[j] j = j - 1 fin mientras A[j + 1] = index fin para fin algoritmo
  • 40.
    Ordenando Shell oShellSort Tomemos un arreglo inicial con los datos [ 74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30 ] . Shell nos propone que hagamos sobre el arreglo una serie de ordenaciones basadas en la inserción directa, pero dividiendo el arreglo original en varios sub-arreglo tales que cada elemento esté separado k elementos del anterior (a esta separación a menudo se le llama sa lto o gap )... Se debe empezar con k=n/2 , siendo n el número de elementos de arreglo, y utilizando siempre la división entera.... después iremos variando k haciéndolo más pequeño mediante sucesivas divisiones por 2, hasta llegar a k=1. Pero vamos a ello... En nuestro ejemplo, n=11 (porque hay 11 elementos). Así que k=n/2=11/2=5 (division entera )
  • 41.
    Ordenando Shell oShellSort Empezamos con k=5. Así pues, vamos a dividir nuestro arreglo original en 5 sub-arreglo, en los cuales, sus elementos estarán separados por 5 lugares del arreglo original (el salto o gap es 5). Vamos a hacerlo con colores. Tomamos el primer elemento (el 74) contamos 5 lugares y tomamos también otro elemento (el 97) volvemos a contar 5 y tomamos otro (el 30) y acabamos porque se nos acaba el arreglo. El primer sub-arreglo con k=5 es el formado por 74, 97 y 30. Vamos a pintarlos en rojo [ 74 , 14, 21, 44, 38, 97 , 11, 78, 65, 88, 30 ]
  • 42.
    Ordenando Shell oShellSort Ahora, ordenaremos los elementos del sub-arreglo rojo pero sólo entre ellos, utilizando el algoritmo de Inserción directa.   30 , 14, 21, 44, 38, 74 , 11, 78, 65, 88, 97   Fíjate qué curioso. El 30, un elemento relativamente pequeño se ha ido hacia el principio y el 97 hacia el final... ¡pero dando saltos ( gap ) de 5 en 5 lugares! Cada uno ha avanzado en saltos de 5 hacia una posición cercana a su ubicación definitiva.
  • 43.
    Ordenando Shell oShellSort El 30, un elemento relativamente pequeño se ha ido hacia el principio y el 97 hacia el final... ¡pero dando saltos ( gap ) de 5 en 5 lugares! Cada uno ha avanzado en saltos de 5 hacia una posición cercana a su ubicación definitiva. Formemos ahora otro sub-arreglo con salto k=5... partiendo del segundo elemento (el 14) y contando 5 (tomamos también el 11) y ya está, porque se acaba el arreglo.   30 , 14 , 21, 44, 38, 74 , 11 , 78, 65, 88, 97
  • 44.
    Ordenando Shell oShellSort Ordenando la parte verde con InsertSort tenemos ahora   30 , 11 , 21 , 44 , 38 , 74 , 14 , 78 , 65 , 88 , 97 Ordenando de pasada la parte rosada que se mantiene igual , lo mismo ocurre con el naranjo y el celeste !. Hemos formado 5 sub-arreglos en los cuales los elementos están separados por 5 lugares (porque k=5). Hemos ordenado cada sub-arreglo por separado utilizando inserción directa, y hemos logrado que cada elemento se dirija hacia su ubicación definitiva en pasos de 5 lugares. Por supuesto, no hemos terminado todavía, pero resulta evidente que algunos elementos, como el 30, el 97 o el 11 han dado un gran salto y que no deben andar muy lejos de su sitio final.
  • 45.
    Ordenando Shell oShellSort Decimos ahora que el arreglo está 5-ordenado. Para continuar con el algoritmo, debemos ir reduciendo progresivamente k dividiéndolo sucesivamente por 2 y k-ordenando los sub-arreglos que nos salgan (recuerda que nos salen k sub-arreglo). Cuando lleguemos a k=1 habremos terminado.   Pero de momento, nuestra k valía 5, así que ahora k←k/2=5/2=2   Nuestra nueva k vale 2. Repetimos todo el tinglado, pero ahora nos saldrán 2 sub-arreglo cuyos elementos están separados por 2 lugares.
  • 46.
    Ordenando Shell oShellSort Decimos ahora que el arreglo está 5-ordenado. Para continuar con el algoritmo, debemos ir reduciendo progresivamente k dividiéndolo sucesivamente por 2 y k-ordenando los sub-arreglos que nos salgan (recuerda que nos salen k sub-arreglo). Cuando lleguemos a k=1 habremos terminado.   Pero de momento, nuestra k valía 5, así que ahora k←k/2=5/2=2   Nuestra nueva k vale 2. Repetimos todo el tinglado, pero ahora nos saldrán 2 sub-arreglo cuyos elementos están separados por 2 lugares.
  • 47.
    Ordenando Shell oShellSort El primero (en marrón) y el segundo (en verde): 30 , 11 , 21 , 44 , 38 , 74 , 14 , 78 , 65 , 88 , 97 Ahora, cada número está mucho más cerca de su posición definitiva... El arreglo está 2-ordenado... pero sigue también 5-ordenado. No hemos perdido el trabajo que hicimos cuando k era 5.   Finalmente, calculamos un nuevo k dividiendo el que tenemos entre 2. k←k/2=2/2=1 Hemos llegado a k=1. Cuando k es 1 sólo podemos obtener 1 sub-arreglo cuyos elementos están separados 1 posición: el propio arreglo original. Dicho de otra manera... cuando k es 1, el algoritmo de Shell se comporta exactamente igual que el de inserción directa sobre todo el arreglo.
  • 48.
    Ordenando Shell oShellSort Sin embargo, las k-ordenaciones que hemos hecho (con k=5 y k=2) han hecho que cada elemento se aproximase con saltos de 5 y luego de 2 posiciones hacia su ubicación definitiva. Ahora que k=1 y que vamos a aplicar el algoritmo de inserción directa tal cual, haremos muchas menos comparaciones e intercambios que si lo hubiéramos aplicado con en arreglo tal como lo teníamos al empezar. El algoritmo de inserción directa se comporta tanto mejor cuanto más cerca está cada elemento de su sitio definitivo.   Finalmente, el arreglo queda de ésta manera:   11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97   Cada elemento descolocado ha tenido que moverse pocos lugares. Muchos de ellos ni siquiera se han movido.