一个引用很多的例子
Haskell:
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
C:
void qsort(int a[], int lo, int hi)
{
int h, l, p, t;
if (lo < hi) {
l = lo;
h = hi;
p = a[hi];
do {
while ((l < h) && (a[l] <= p))
l = l+1;
while ((h > l) && (a[h] >= p))
h = h-1;
if (l < h) {
t = a[l];
a[l] = a[h];
a[h] = t;
}
} while (l < h);
a[hi] = a[l];
a[l] = p;
qsort( a, lo, l-1 );
qsort( a, l+1, hi );
}
}
haskell的解释一下,c的不解释
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
--pattern match,由上而下寻找函数入口,传入参数是空表时匹配第一个入口,非空时匹配第二个。就是说,对空表,qsort返回空表
--当传入参数非空时,匹配其递归形式(recursive function),使用了高阶函数嵌套。
--filter是一个函数,它的类型声明是 filter :: (a -> Bool) -> [a] -> [a] 。里面有两个参数,第一个参数是( a -> Bool ) ,是一个函数(一个接受类型 a 并返回一个Bool 的函数),第二个是一个List(至于List里面是什么类型,we just don't f*cking care),最后返回一个List。简单一点,filter就是将List里面使( a -> Bool )返回false的个体滤掉。
--加号就是把得到的表连起来,最后qsort就返回了一个排序后的List
--举个栗子让大伙容易理解一些。现在要对[3,7,5,2]排序:qsort [3,7,5,2],首先进行pattern match,进入qsort (3,[7,5,2]) = qsort( filter(<3) [7,5,2] ) ++ [3] ++ qsort( filter(>=3) [7,5,2] ) ,filter完以后就是 qsort [2] ++ [3] ++ qsort [7,5] ,再展开下一级递归就是,qsort [] ++ [2] ++ qsort [] ++ [3] ++ qsort [5] ++ [7] ++ qsort [],跳过最后一步递归(大家都懂的),结果就是[2,3,5,7]。
--看着一大坨,不过这东西又不用你来干,急啥呢。效率嘛,不会比C的差,关键还得看码字嘛。重要的是不需要调试(其实没得调,但你基本写不出会出错的程序)。至于那些纠结为什么不一个一个挑出来排序的童鞋,应该去看看数据结构或者啃啃算法导论。