Consider for instance the following lines of code:
f = 
f(x:xs) = f ys ++ [x] ++ f zs
ys = [a | a <- xs, a <= x]
zs = [b | b <- xs, b > x]
Did you understand what it does?? It's the quicksort algorithm, expressed in just 5 lines. Initially it may look quite strange, but actually it is very intuitive. For instance in the first line f =  is the definition of the recursive "basic" condition, what follows is the recursive call itself. The function accepts a list (x:xs), an x followed by many xs :) . The part f ys ++ [x] ++ f zs basically says that you take the "x" in the middle and you add ys before and zs after. Note this are the recursive calls on the function f. ys and zs are defined below, where ys is a list with elements "a" which will take values from the xs if a <= x. Essentially in ys all elements will be added which are before (less than) x. The contrary holds for the zs. And so you get the sorted list.
*Main> f [2, 4, 11, 4, 2, 18,5, 3]
Functional programming is extremely efficient. There exist a bunch of libraries which are written in functional programming languages. Even Microsoft added functional programming style pieces into C#, the C# lambda expressions which are very handy especially for dealing with lists (sorting, filtering etc...).
Haskell in 10 minutes