一个简单的quicksort代码可以解释如何用haskell提高效率

一个引用很多的例子

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的差,关键还得看码字嘛。重要的是不需要调试(其实没得调,但你基本写不出会出错的程序)。至于那些纠结为什么不一个一个挑出来排序的童鞋,应该去看看数据结构或者啃啃算法导论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值