Java Quicksort
Java Quicksort
http://puntocomnoesunlenguaje.blogspot.com/2012/12/java-quicksort.html
Se basa en la técnica divide y vencerás, que consiste en ir subdividiendo el array en arrays más
pequeños, y ordenar éstos. Para hacer esta división, se toma un valor del array como pivote, y se
mueven todos los elementos menores que este pivote a su izquierda, y los mayores a su derecha. A
continuación se aplica el mismo método a cada una de las dos partes en las que queda dividido el array.
Cuando se han encontrado los dos elementos anteriores, se intercambian, y se sigue realizando la
búsqueda hasta que las dos búsquedas se encuentran.
Suponiendo que tomamos como pivote el primer elemento, el método Java Quicksort que implementa
este algoritmo de ordenación para ordenar un array de enteros se presenta a continuación. Los
parámetros izq y der son el primer y último elemento del array a tratar en cada momento.
El método ordena un array A de enteros desde la posición izq hasta la posición der. En la primera llamada
recibirá los valores izq = 0, der = ELEMENTOS-1.
La elección del pivote determinará la eficiencia de este algoritmo ya que determina la partición del array.
Si consideramos que el array está desordenado, podemos elegir el primer elemento y el algoritmo
funcionaría de forma eficiente. Pero si el array está casi ordenado, elegir el primer elemento como pivote
sería una mala solución ya que obtendríamos un subarray muy pequeño y otro muy grande. Por la misma
razón, elegir el último elemento del array como pivote también es una mala idea. Pretendemos conseguir
que el tamaño de los subarrays sea lo más parecido posible.
Una alternativa a elegir el primer elemento es elegir como pivote un elemento al azar de entre todos los
del array.
Otra estrategia es calcular la mediana de los valores de la izquierda, centro y derecha del vector.
Por ejemplo para el vector: 9 8 1 6 10 2 3, se calcula la mediana de los elementos que ocupan el primer
lugar, el último y el centro o sea 9 3 6. La mediana es 6 que determinaría las particiones {1 3 2} {6} {8 10
9}.
En el peor caso, cuando el pivote es el elemento menor del array el tiempo de ejecución del
método Quicksort es O(n2).
En general el tiempo medio de ejecución del Quicksort es O(n log n).
for(int i = 0;i<array.length;i++)
System.out.println(array[i));
Algoritmo Mergesort.
if (n % 2 == 0) {
while (k < n) {
if (i >= (n / 2)) {
z[k] = a2[j];
j++;
} else if (j >= (n / 2)) {
z[k] = a1[i];
i++;
} else if (a1[i] <= a2[j]) {
z[k] = a1[i];
i++;
} else {
z[k] = a2[j];
j++;
}
k++;
}
return z;
} else {
while (k < n) {
if (i >= ((n - 1) / 2)) {
z[k] = a2[j];
j++;
} else if (j >= ((n + 1) / 2)) {
z[k] = a1[i];
i++;
} else if (a1[i] <= a2[j]) {
z[k] = a1[i];
i++;
} else {
z[k] = a2[j];
j++;
}
k++;
}
return z;
}
}