Publicidad:
La Coctelera

un rato de sol

i will work harder, ja ja ja, no ahora en serio.

21 Octubre 2008

busque, compare y si encuentra algo mejor...

Un post rápido, comparando implementaciones de un algoritmo en su aproximación funcional e imperativa.

Cuando empezamos a programar, normalmente lo hacemos en un lenguaje imperativo, y el primer programa que tecleamos es nuestro querido "hola mundo". Bien, en el mundo funcional existe un equivalente al hola mundo que suele ser escribir una función que genere la serie de fibonacci, pero creo que será más interesante algo un poquito más complicado, usemos el quicksort:

1-pseudocódigo

 function quicksort(array)
      var list less, greater
      if length(array) ≤ 1  
          return array  
      select and remove a pivot value pivot from array
      for each x in array
          if x ≤ pivot then append x to less
          else append x to greater
      return concatenate(quicksort(less), pivot, quicksort(greater))
 

2.- C

 void Quicksort(int[] v, int prim, int ult) {
         if (prim < ult) {
                 int p = Pivot(v, prim, ult, ult);
 
                 Quicksort(v, prim, p - 1);
                 Quicksort(v, p + 1, ult);
         }
 }
  
 int Pivot(int[] v, int prim, int ult, int piv) {
         int p = v[piv];
         int j = prim;
 
         swap(v, piv, ult);
  
         for (int i = prim; i < ult; i++) {
                 if (v[i] <= p) {
                         swap(v, i, j);
                         j++;
                 }
         }
         swap(v, j, ult);
  
         return j;
 }
  
 void swap(int[] v, int a, int b) {
         if (a != b) {
                 int tmp = v[a];
                 v[a] = v[b];
                 v[b] = tmp;
         }
 }
 

3.-Java

 public class QuickSort {
    public static void swap (int A[], int x, int y) {
       int temp = A[x];
       A[x] = A[y];
       A[y] = temp;
    }
                
    public static int partition(int A[], int f, int l) {
       int pivot = A[f];
       while (f < l) {
          while (A[f] < pivot) f++;
          while (A[l] > pivot) l--;
          swap (A, f, l);
       }
       return f;
    }
 
    public static void Quicksort(int A[], int f, int l) {
       if (f >= l) return;
       int pivot_index = partition(A, f, l);
       Quicksort(A, f, pivot_index);
       Quicksort(A, pivot_index+1, l);
    }
 }
 

4.-Clojure Lisp

 (defn qsort
   ([] [])
   ([x & xs] (concat (apply qsort (filter #(< % x) xs))
 		    (cons x (apply qsort (filter #(>= % x) xs)))))) 
 

5.-Haskell

 qsort []     = []
 qsort (x:xs) = qsort smaller ++ [x] ++ qsort bigger
     where smaller = filter (<x)  xs
           bigger = filter (>=x) xs 
 

Los ejemplos están sacados de wikipedia, menos el de Clojure Lisp. Lo dicho, busque, compare, etc.

servido por Antonio sin comentarios compártelo

sin comentarios · Escribe aquí tu comentario

Escribe tu comentario


Sobre mí

Avatar de Antonio

un rato de sol

Barcelona/Salamanca, España
ver perfil »
contacto »
Trabajador del metal y del acero, en la gloriosa XING AG, escribo software con el que poder ganarme el jornal. En mi tiempo libre sigo tecleando código de bonitos colores a medio camino entre lo sublime y lo terrible. Últimamente me gustan mucho los gatos.

Fotos

Antonio Garrote Hernández todavía no ha subido ninguna foto.

¡Anímale a hacerlo!

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera