Está en la página 1de 33

Algoritmo Quicksort

Dado un arreglo de n elementos (ej. enteros):



SI el arreglo sólo contiene un elemento, devolver

DE LO CONTRARIO
 Elegir un elemento que se usará como pivote.
 Partir los elementos en dos sub-arreglos:

Elementos mayores o iguales que el pivote

Elementos menores que el pivote
 Aplicar el Quicksort a los sub-arreglos
 Devolver resultados
Ejemplo
Dado el siguiente vector de enteros:
40 20 10 80 60 50 7 30 100
Elegir el Pivote
Hay diversas formas de elegir el pivote. En este ejemplo
usaremos el primer elemento del arreglo:

40 20 10 80 60 50 7 30 100
Partir el areglo
Dado el pivote, partir los eleentos del arreglo tal que
resulten dos subarreglos consistentes de:
1. Un sub-arreglo que contiene los elementos >= pivote
2. Otro sub-arreglo que contiene los elementos
elementos < pivote

Los sub-arreglos se almacenan en el arreglo original.

Hay ciclos de partición, en los que se intercambian


elementos antes/despues del pivote.
indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1. Mientras vector[indice_i] <= vector[pivote]
++i

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1. Mientras vector[indice_i] <= vector[pivote]
++i

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1. Mientras vector[indice_i] <= vector[pivote]
++i

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]
indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]

indice_pivote = 0 40 20 10 80 60 50 7 30 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= indice[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 60 50 7 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.
5. cambiar vector[j] y vector[pivote]

indice_pivote = 0 40 20 10 30 7 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
1.Mientras vector[indice_i] <= vector[pivote]
++i
2. Mientras vector[indice_j] > vector[pivote]
j--
3. SI i < j
cambiar vector[i] y vector[j]
4. Mientras j> i, ir a 1.
5. cambiar vector[j] y vector[pivote]

indice_pivote = 4 7 20 10 30 40 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

indice_i indice_j
Resultado de la Partición

7 20 10 30 40 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

<= vector[pivote] > vector[pivote]


Recursion: Quicksort Sub-
arreglos

7 20 10 30 40 50 60 80 100
[0] [1] [2] [3] [4] [5] [6] [7] [8]

<= vector[pivote] > vector[pivote]


Quicksort Codigo Java
public static void ordenarQuicksort(int[] vector, int primero, int
ultimo){
int i=primero, j=ultimo;
int pivote=vector[(primero + ultimo) / 2];
do{
while(vector[i]<pivote) i++;
while(vector[j]>pivote) j--;
if (i<=j){
cambiar(i,j);
i++;
j--;

}
} while (i<=j);
if(primero<j) ordenarQuicksort(vector,primero, j);
if(ultimo>i) ordenarQuicksort(vector,i, ultimo);
}

También podría gustarte