Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1659343
  • 博文数量: 230
  • 博客积分: 10045
  • 博客等级: 上将
  • 技术积分: 3357
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-30 20:40
文章分类

全部博文(230)

文章存档

2011年(7)

2010年(35)

2009年(62)

2008年(126)

我的朋友

分类:

2008-06-06 21:59:33

(* qsort *)
let rec qsort lst = match lst with
  [] -> []
  | x::xs -> qsort (List.filter (fun y -> y <= x) xs) @ [x] @ qsort (List.filter (fun y -> y > x) xs);;

open Format;;
open Genlex;;

let fprint_list pr ppf = function
  | [] -> fprintf ppf "[]"
  | x :: xs ->
      let f ppf = List.iter (fun x -> fprintf ppf ";@ %a" pr x) xs in
      fprintf ppf "@[<1>[%a%t]@]" pr x f;;  
 
let lexer = make_lexer ["["; "]"; ";"]  ;;

let rec parse_U = parser
  | [< 'Kwd ";"; 'Int n; ns = parse_U >] -> n :: ns
  | [< >] -> []
  ;;

let parse_T = parser
  | [< 'Int n; ns = parse_U; >] -> n :: ns
  | [< >] -> []
  ;;

let parse_S = parser
  | [< 'Kwd "["; list = parse_T; 'Kwd "]" >] -> list

let parse = parse_S

let read_from_channel ch =
  parse (lexer (Stream.of_channel ch))

let sum list = List.fold_left (+) 0 list

let () =
  let in_channel = open_in Sys.argv.(1) in
  let list = read_from_channel in_channel in
  close_in in_channel;
  printf " %a \n" (fprint_list pp_print_int) (qsort list)

这个qsort与算法本身很接近,而且使用递归在OCaml中的效率很高。

编译这段代码:
ocamlc -o qsort.exe -pp camlp4o qsort.ml
阅读(1667) | 评论(2) | 转发(0) |
0

上一篇:2008年6月读书

下一篇:(转)Recursion

给主人留下些什么吧!~~

bilbo02142008-09-15 10:28:22

No, not all the code. I learn the code algorithm framework from a lecture, it is very similar to ocaml implementation, after then, I add the left code. That is all.

xfzhu20032008-09-15 00:02:30

u coded it by urself?