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.
Hola amigo, como estas? , como puedo contactar contigo necesito que me ayudes en algo y no se si puedas ayudarme tu .
niño marrano
Muy mal no es recursivo, como dices.
Si es recursivo, al final de qs() esta la recursividad, ¿què te hace estar tan seguro de lo que dices?
No es recursivo.
Explicame que hace la operación de la linea 39, esa division.
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.
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);}
}
}
no le presten atencion a esto que acabo de subir, no se como copiar el codigo y se copia cualquier cosa todo deforme
¿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;?
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
corri tu codigo y no funciono . . . .:-/
a mi me corrio bien
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
Mucho más fácil de entender que en mis apuntes… gracias:)
Si queremos que se imprima cada corrida en donde es el lugar inficado para poner el printf?