De momento (creo que) tenemos el algoritmo de merge óptimo para dos vectores… pero nuestro objetivo va más allá.La idea es hallar un merge para N vectores, pero como no parece fácil, vayamos pasito a pasito.Lo hemos hecho para dos, intentémoslo para tres vectores. Sean tres vectores, v1, v2 y v3, parece que una generalización del algoritmo anterior debería de empezar por comparar los centros, al menos uno de ellos.Como queremos que el merge sea estable, las posiciones de los vectores si que importan, por lo tanto empezaremos por el vector central.
v1: |1|2|3|4|5|6|7|8|9|
v2: |1|2|3|4|5|6|7|8|9|
v3: |1|2|3|4|5|6|7|8|9|
Seguimos comparando centros de vectores, por lo tanto elegiremos el central de los centros como pivote, y empezaremos por comapararlo con los otros dos centros.
Tenemos 5<=5<=5.
Por lo tanto:
v1: |6|7|8|9|
v2: |1|2|3|4|5|6|7|8|9|
v3: |1|2|3|4|
Ahora tenemos 7>5>2, por tanto:
v1: |6|
v2: |1|2|3|4|5|6|7|8|9|v3: |3|4|
6>5>3
v1: v2: |1|2|3|4|5|6|7|8|9|v3: |4|
5>4
En resumen, hemos separado los tres vectores en relación a nuestro pivote que era el elemento más central, por ser del que más información se obtiene al compararlo.
Tenemos
|1|2|3|4|5| |6|7|8|9|
|1|2|3|4| 5 |6|7|8|9|
|1|2|3|4| |5|6|7|8|9|
Tán sólo nos queda repetir la operación de forma recursiva, y tenemos el mejor merge que haya visto un mergesort, usandolo en lugar del merge tradicional, se reduciría el número de comparaciones y sobre todo el movimiento de datos, al mezclar los vectores de forma óptima de tres en tres.
(more…)