Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor información.
PDF generated at: Sat, 16 Oct 2010 04:12:12 UTC
Quicksort 1
Quicksort
El ordenamiento rápido (quicksort en inglés)
es un algoritmo basado en la técnica de divide y
vencerás, que permite, en promedio, ordenar n
elementos en un tiempo proporcional a n log n.
Demostración
Podríamos probar el orden de ejecución en el mejor caso de la siguiente manera:
Vamos a suponer que el número total de elementos a ordenar es potencia de dos, es decir, . de aquí
podemos ver que , donde k es el número de divisiones que realizará el algoritmo.
En la primera fase del algoritmo habrán n comparaciones, en la segunda fase el algoritmo creará dos sublistas
aproximadamente de tamaño n/2. El número total de comparaciones de estas dos sublistas es: 2(n/2) = n. En la
tercera fase el algoritmo procesará 4 sublistas más, por tanto el número total de comparaciones en esta fase es 4(n/4)
= n.
En conclusión, el número total de comparaciones que hace el algoritmo es:
Quicksort 2
Técnicas de reposicionamiento
Una idea preliminar para ubicar el pivote en su posición final sería contar la cantidad de elementos menores que él, y
colocarlo un lugar más arriba, moviendo luego todos esos elementos menores que él a su izquierda, para que pueda
aplicarse la recursividad.
Existe, no obstante, un procedimiento mucho más efectivo. Se utilizan dos índices: i, al que llamaremos índice
izquierdo, y j, al que llamaremos índice derecho. El algoritmo es el siguiente:
• Recorrer la lista simultáneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con
j (desde el último elemento).
• Cuando lista[i] sea mayor que el pivote y lista[j] sea menor, se intercambian los elementos en esas posiciones.
• Repetir esto hasta que se crucen los índices.
• El punto en que se cruzan los índices es la posición adecuada para colocar el pivote, porque sabemos que a un
lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados).
• Parámetros:
• Se debe llamar a la función Quicksort desde donde quiera ejecutarse
• Ésta llamará a colocar pivote para encontrar el valor del mismo
• Se ejecutará el algoritmo Quicksort de forma recursiva a ambos lados del pivote
pivote = b;
valor_pivote = v[pivote];
for (i=b+1; i<=t; i++){
if (v[i] < valor_pivote){
pivote++;
temp=v[i];
v[i]=v[pivote];
v[pivote]=temp;
}
}
temp=v[b];
v[b]=v[pivote];
v[pivote]=temp;
return pivote;
}
Nota: Los tres parámetros de la llamada inicial a Quicksort serán array[0], 0, numero_elementos -1, es decir, si es un
array de 6 elementos array[0], 0, 5
Quicksort 4
Ejemplo
En el siguiente ejemplo se marcan el pivote y los índices i y j con las letras p, i y j respectivamente.
Comenzamos con la lista completa. El elemento pivote será el 4: 5 - 3 - 7 - 6 - 2 - 1 - 4 p Comparamos con el 5 por la
izquierda y el 1 por la derecha. 5 - 3 - 7 - 6 - 2 - 1 - 4 i j p 5 es mayor que 4 y 1 es menor. Intercambiamos: 1 - 3 - 7 -
6 - 2 - 5 - 4 i j p Avanzamos por la izquierda y la derecha: 1 - 3 - 7 - 6 - 2 - 5 - 4 i j p 3 es menor que 4: avanzamos
por la izquierda. 2 es menor que 4: nos mantenemos ahí. 1 - 3 - 7 - 6 - 2 - 5 - 4 i j p 7 es mayor que 4 y 2 es menor:
intercambiamos. 1 - 3 - 2 - 6 - 7 - 5 - 4 i j p Avanzamos por ambos lados: 1 - 3 - 2 - 6 - 7 - 5 - 4 iyj p En este
momento termina el ciclo principal, porque los índices se cruzaron. Ahora intercambiamos lista[i] con lista[sup]
(pasos 16-18): 1 - 3 - 2 - 4 - 7 - 5 - 6 p Aplicamos recursivamente a la sublista de la izquierda (índices 0 - 2).
Tenemos lo siguiente: 1 - 3 - 2 1 es menor que 2: avanzamos por la izquierda. 3 es mayor: avanzamos por la derecha.
Como se intercambiaron los índices termina el ciclo. Se intercambia lista[i] con lista[sup]: 1 - 2 - 3
El mismo procedimiento se aplicará a la otra sublista. Al finalizar y unir todas las sublistas queda la lista inicial
ordenada en forma ascendente. 1 - 2 - 3 - 4 - 5 - 6 - 7
Implementaciones
El algoritmo de ordenamiento rápido (Quicksort) en:
Pseudocódigo
function quicksort(array)
var list, less, greater
if length(array) ≤ 1
return array
seleccionar y eliminar un valor pivote pivot en el array
for each x in array
if x < pivot then añadir x a less
else añadir x a greater
return concadenar(quicksort(less), pivot, quicksort(greater))
lugar.
return indiceAlmacenamiento;
}
Otra en C. Trabaja sólo con punteros (no índices). Ordena enteros de menor a mayor. Pivot: El primero del vector.
while(izq<der)
{
while(*izq<=pivot && izq<der+1) izq++;
while(*der>pivot && der>izq-1) der--;
if(izq<der) swap(izq,der);
}
swap(pri,der);
quicksort(pri,der-1);
quicksort(der+1,ult);
}
Java
do{
while(vector[i]<pivote) i++;
while(vector[j]>pivote) j--;
if (i<=j){
auxiliar=vector[j];
vector[j]=vector[i];
vector[i]=auxiliar;
i++;
j--;
}
} while (i<=j);
C#
return j;
}
Python
while i < j:
while datos[i] < pivote:
i+=1
while datos[j] > pivote:
j-=1
if i <= j:
aux = datos[i]
datos[i] = datos[j]
datos[j] = aux
i+=1
j-=1
Quicksort 8
if primero < j:
datos = quicksort(datos, primero, j)
if ultimo > i:
datos = quicksort(datos, i, ultimo)
return datos
Otra en Python
def qsort(list):
try:
x=list.pop()
except:
return []
return qsort(filter((lambda y: y<x), list)) + [x] + qsort(filter((lambda y: y>=x), list))
Haskell
Otra en Haskell
Asm
quicksort:
push ebp
mov ebp,esp
push esi
push ebx
push ecx
push edx
mov ebx,dword[ebp + 12]
mov ecx,dword[ebp + 16]
cdq
mov eax, ebx
add eax, ecx
push ecx
mov ecx,2
div ecx
pop ecx
xchg edx,eax
Quicksort 9
pop ebp
retn 12
Prolog
quicksort([], []).
quicksort([CABEZA | COLA], ORDENADO) :- partir(CABEZA, COLA, IZDA,
DCHA),
quicksort(IZDA, ORDENADO_IZDA),
quicksort(DCHA, ORDENADO_DCHA),
concatenar(ORDENADO_IZDA, [CABEZA |
ORDENADO_DCHA], ORDENADO).
Véase también
• Algoritmo de ordenamiento.
Referencias
• Quick Sort [1] - Implementación en C
• Ordenamiento rápido, Implementación y descripción [2]
• Explicación vídeo de Quicksort usando tarjetas y del código en C++ Video [3]
• Quick Sort [4] - Implementación en C, PHP, C++,C#,Java, VB, Perl, Prolog, Ruby
• QuickSort C Code [5]
Referencias
[1] http:/ / www. mis-algoritmos. com/ source-81. html
[2] http:/ / www. mis-algoritmos. com/ 2006/ 12/ 27/ ordenamiento-rapido-quicksort/
[3] http:/ / www. datastructures. info/ what-is-quicksort-and-how-does-it-work-quick-sort-algorithm/
[4] http:/ / www. algorithm-code. com/ wiki/ Quick_Sort
[5] http:/ / www. codeuu. com/ Quicksort
Fuentes y contribuyentes del artículo 11
Licencia
Creative Commons Attribution-Share Alike 3.0 Unported
http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/