Quicksort en C – Algoritmo de ordenamiento

Quicksort es uno de los algoritmos por excelencia utilizados para ordenar secuencias de datos. En esta ocasión implementaremos quicksort de manera recursiva en lenguaje C.

Codigo fuente quicksort en C

El siguiente programa declara las funciones qs(recursivo) y quicksort para ordenar una secuencia de numeros, imprimer el arreglo separado por comas.

#include <stdio.h>

void qs(int lista[],int limite_izq,int limite_der)
{
    int izq,der,temporal,pivote;

    izq=limite_izq;
    der = limite_der;
    pivote = lista[(izq+der)/2];

    do{
        while(lista[izq]<pivote && izq<limite_der)izq++;
        while(pivote<lista[der] && der > limite_izq)der--;
        if(izq <=der)
        {
            temporal= lista[izq];
            lista[izq]=lista[der];
            lista[der]=temporal;
            izq++;
            der--;

        }

    }while(izq<=der);
    if(limite_izq<der){qs(lista,limite_izq,der);}
    if(limite_der>izq){qs(lista,izq,limite_der);}

}

void quicksort(int lista[],int n)
{
    qs(lista,0,n-1);
}

int main(int argc, const char * argv[])
{

    int lista[] ={100,56,0,1,-45,2,46,5,9,6,67,23,5};
    int size = sizeof(lista)/sizeof(int);

    printf("Lista Desordenada \n");

    for (int i=0; i<size; i++) {
        printf("%d",lista[i]);
        if(i<size-1)
            printf(",");
    }

    printf("\n");
    quicksort(lista,size);

    printf("Lista Ordenada \n");
    for (int i=0; i<size; i++) {
        printf("%d",lista[i]);
        if(i<size-1)
            printf(",");
    }

    return 0;
}

Video tutorial: En este video explico como se realiza el codigo realizado previamente.

Espero que le haya gustado la implementación del codigo.

Acerca del autor:

Mi nombre es Jorge Villalobos, soy Colombiano de nacimiento y resido en México desde 2005,actualmente soy el creador de codigoprogramacion.com Soy ingeniero en tecnologías de información y comunicaciones y trabajo de tiempo completo desarrollando aplicaciones web. En general me considero un tipo normal, me gusta salir, divertirme, y uno de mis hobbies es programar y hacer tutoriales para compartir conocimiento, me gusta la pizza, el ajedrez y tomar una que otra cerveza los fines de semana. Espero que este proyecto ayude a ayudar a los demás.

Twitter del autor:

16 comments

  1. oscar says:

    Hola amigo, como estas? , como puedo contactar contigo necesito que me ayudes en algo y no se si puedas ayudarme tu .

  2. jorge nitales says:

    niño marrano

  3. mike says:

    Muy mal no es recursivo, como dices.

  4. mike says:

    No es recursivo.

  5. Bryan Andres says:

    Explicame que hace la operación de la linea 39, esa division.

  6. diego says:

    En ansi c -std99 el casteo dentro del primer condicionamiento del for no lo admite. se debe castear “int i” antes de la estructra logica. El codigo de hecho si funciona.Compilado bajo consola.
    Muy buena explicacion. Me meti porque habia olvidado el algoritmo del pivote jejeje.

  7. Lucio says:

    Gracias, dejo una alternativa para qs,tomo como pivote al primer elemento pero queda a eleeccion de cada uno

    void qs(int lista[],int limite_izq, int limite_der){
    int izq = limite_izq;
    int der = limite_der;
    int aux;
    while(izq a[izq+1]){
    aux = a[izq+1];
    a[izq+1] = a[izq];
    a[izq] = aux;
    izq++;
    }else{
    aux = a[izq+1];
    a[izq+1] = a[der];
    a[der] = aux;
    der–;
    }

    if(izq d){qsAux(a,d,der-1);}

    }

    }

    • Lucio says:

      no le presten atencion a esto que acabo de subir, no se como copiar el codigo y se copia cualquier cosa todo deforme

    • Laseario says:

      ¿La mejor forma no sería directamente darle al pivote el valor de en medio, es decir: pivot = (limite_izq + limite_der)/2 + 0,5;?

  8. maria juana says:

    Cuando izq y der se cruzan, no tendrias que colocar el pivote en esa posicion? ,que seria la posicion final del pivote en el arreglo ordenado

  9. iisa says:

    corri tu codigo y no funciono . . . .:-/

  10. susana says:

    no tendras videos de otros medios de ordenamiento?
    printf(“4.Ordenar la matriz por el metodo de seleccion o intercambio directo”);
    printf(“5.Buscar un elemento en la matriz por el método secuencial”);
    printf(“6.Buscar un elemento por el metodo binario”);
    help me

  11. paula says:

    Mucho más fácil de entender que en mis apuntes… gracias:)

  12. marialuisa says:

    Si queremos que se imprima cada corrida en donde es el lugar inficado para poner el printf?

Leave a Reply to paula Cancel reply

Your email address will not be published. Required fields are marked *