/*
+---------------------------+
| ORDENACION RAPIDA (QSORT) |
+---------------------------+
En este programa se realiza la ordenación creciente de un
vector de números enteros.
El método de ordenación seguido ha sido el de ordenación
rápida.
La ordenación rápida, inventada y nombrada por C.A.R. Hoare,
está considerada como el mejor algoritmo de ordenación disponible
actualmente. Está basada en la ordenación por el método de
intercambio.
La ordenación rápida se basa en la idea de las particiones.
El procedimiento general es seleccionar un valor llamado comparando
y entonces dividir el array en dos partes. En un lado todos los
elementos mayores o iguales al valor de partición y en otro todos
los elementos menores que el valor. Este proceso se repite en cada
parte restante hasta que el array está ordenado.
Como se puede ver, este proceso es esencialmente recursivo
por naturaleza y, de hecho, las implementaciones más claras de la
ordenación rápida es por algoritmos recursivos.
La selección del valor comparado se puede obtener de dos
formas. Se puede seleccionar aleatoriamente o haciendo la media de
un pequeño conjunto de valores tomados del array. Para una
ordenación óptima es mejor seleccionar un valor que esté
precisamente en medio del rango de valores. Sin embargo, esto no es
fácil de hacer en la mayoría de los conjuntos de datos. En el caso
peor, el valor escogido está en un extremo. Incluso en este, la
ordenación rápida todavía funciona bien. La versión de la ordenación
rápida que sigue selecciona el elemento mitad del array. Aunque no
siempre será una buena elección, la ordenación sigue funcionanado
correctamente.
Ejemplo:
Secuencia inicial 8 2 5 3 9
Elemento comparando: 5
Primer paso 3 2 5 8 9
Ahora se ordena con el mismo procedimiento los vectores '3 2' y
'8 9'
*/
#include <stdio.h> /* printf () */
#include <stdlib.h> /* rand () */
#include <conio.h> /* getch () */
#define NUM_ELEMENTOS_VECTOR 100
void ordenar (int vect[], int ind_izq, int ind_der);
void main (void)
{
int vector [NUM_ELEMENTOS_VECTOR]; /* declaración de un vector de
elementos int */
register int i; /* declaración de una variable registro de tipo
entera */
/* Escritura de la cabecera. */
printf ("ORDENACION DE UN VECTOR DESORDENADO POR EL METODO DE "
"ORDENACION RAPIDA:");
/* Relleno aleatorio de los 100 componentes del vector. A cada
componente se le asigna un valor aleatorio entre 0 y 999. Las
componentes del vector van desde la 0 hasta la
NUM_ELEMENTOS_VECTOR-1 inclusive. */
for (i = 0; i < NUM_ELEMENTOS_VECTOR; i++)
vector[i] = rand () % 1000;
/* Escritura en pantalla del vector desordenado. */
printf ("\n Vector desordenado:\n");
for (i = 0; i < NUM_ELEMENTOS_VECTOR; i++)
printf ("%d\t", vector[i]);
/* Ordenación del vector por el método de inserción directa. */
ordenar (vector, 0, NUM_ELEMENTOS_VECTOR-1);
/* Escritura en pantalla del vector ordenado. */
printf ("\n Vector ordenado:\n");
for (i = 0; i < NUM_ELEMENTOS_VECTOR; i++)
printf ("%d\t", vector[i]);
/* Espera la pulsación de cualquier tecla para finalizar el
programa. */
getch ();
}
void ordenar (int vect[], int ind_izq, int ind_der)
{ /* vect: vector, ind_izq: índice izquierdo, ind_der: índice
derecho */
register int i, j; /* variables índice del vector */
int elem; /* contiene un elemento del vector */
i = ind_izq;
j = ind_der;
elem = vect[(ind_izq+ind_der)/2];
do
{
while (vect[i] < elem && j < ind_der) /* recorrido del vector
hacia la derecha */
i++;
while (elem < vect[j] && j > ind_izq) /* recorrido del vector
hacia la izquierda */
j--;
if (i <= j) /* intercambiar */
{
int aux; /* variable auxiliar */
aux = vect[i];
vect[i] = vect[j];
vect[j] = aux;
i++;
j--;
}
} while (i <= j);
if (ind_izq < j)
ordenar (vect, ind_izq, j);
if (i < ind_der)
ordenar (vect, i, ind_der);
}