Tiempo mejor: O(nlogn)
Tiempo peor: O(n^2)
Espacio: O(n)
Explicación
00:02 Explicación base
05:00 Código paso a paso en C++
Código
#include<iostream>
using namespace std;
int pos_pivote(int arr[], int ini, int fin){
int pivote = arr[fin];
int i = ini;
for (int j=ini; j<fin; j++){
if (arr[j]<pivote){
swap(arr[i], arr[j]);
i++;
// swap(arr[i++], arr[j]); // for one-line lovers
}
}
swap(arr[fin], arr[i]);
return i;
}
void quick_sort(int arr[], int ini, int fin){
int i;
if (ini<fin){
i = pos_pivote(arr, ini, fin);
quick_sort(arr, ini, i-1);
quick_sort(arr, i+1, fin);
}
}
int main(){
int arr[] = {3,5,8,7,2,1,6};
quick_sort(arr, 0, 6);
for (int i=0; i<7; i++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
OUTPUT:
1 2 3 5 6 7 8
Con Templates
Si quieres que el algoritmo trabaje con array de cualquier tipo (double, int, char, etc) puedes usar plantillas de función (templates).
En este post (video) puedes saber como funcionan las templates y aprender a usarlas.
#include<iostream>
using namespace std;
template<typename T>
int pos_pivote(T arr[], int ini, int fin){
T pivote = arr[fin];
int i = ini;
for (int j=ini; j<fin; j++){
if (arr[j]<pivote){
swap(arr[i], arr[j]);
i++;
}
}
swap(arr[fin], arr[i]);
return i;
}
template<typename T>
void quick_sort(T arr[], int ini, int fin){
int i;
if (ini<fin){
i = pos_pivote(arr, ini, fin);
quick_sort(arr, ini, i-1);
quick_sort(arr, i+1, fin);
}
}
int main(){
int arri[] = {9, 9, 10, 11, 9, 8, 9};
double arrd[] = {9.4, 9.6, 10.5, 11.5, 9, 8, 9};
int ni = sizeof(arri)/sizeof(arri[0]);
cout<<"ordenando "<<ni<<" elementos de arri..."<<endl;
quick_sort(arri, 0, ni-1);
for (int i=0; i<ni; i++){
cout<<arri[i]<<" ";
}
cout<<endl;
int nd = sizeof(arri)/sizeof(arri[0]);
cout<<"ordenando "<<nd<<" elementos de arrd ..."<<endl;
quick_sort(arrd, 0, nd-1);
for (int i=0; i<nd; i++){
cout<<arrd[i]<<" ";
}
cout<<endl;
return 0;
}
OUTPUT
ordenando 7 elementos de arri…
8 9 9 9 9 10 11
ordenando 7 elementos de arrd …
8 9 9 9.4 9.6 10.5 11.5
Si encuentra algún error puede colocarlo en los comentarios para contribuir a mejorar esta web.
Puede escribir al autor en rogrp6@gmail.com
¡Gracias por visitar este post!
