+/* vim: set et sts=4 sw=4 fdm=marker fmr={,} fdn=1 fo+=t tw=80:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 4:
+ * Ordena texto ASCII o Unicode.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: Mon Sep 22 21:00:15 ART 2003
+ *
+ * $Id$
+ */
+
+#ifndef QUICKSORT_H
+#define QUICKSORT_H
+
+#include <cstdlib>
+#include <vector>
+#include <cmath>
+
+/// Intercambia 2 índices del vector.
+template < class T >
+void swap(std::vector< T >& v, int i, int j) {
+ T tmp = v[i];
+ v[i] = v[j];
+ v[j] = tmp;
+}
+#include <iostream>
+/// Genera un índice al azar.
+int rnd(int i, int j) {
+ return i + rand() % (j-i+1);
+}
+
+/// Algoritmo de ordenamiento generico para ordenar un vector.
+template < class T >
+void quicksort(std::vector< T >& v, int left, int right) {
+ // Asigno como último al de la izquierda.
+ int last = left;
+ // Si los extremos se juntan, termina.
+ if (left >= right) {
+ return;
+ }
+ // Intercambia.
+ swap(v, left, rnd(left, right));
+ for (int i = left + 1; i <= right; i++) {
+ if (v[i] < v[left]) {
+ swap(v, ++last, i);
+ }
+ }
+ swap(v, left, last);
+ // Llama recursivamente para los fragmentos.
+ quicksort(v, left, last - 1);
+ quicksort(v, last + 1, right);
+}
+
+#endif // QUICKSORT_H