博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

好好学习

  bilbo.cublog.cn

关于作者
姓名:你知道
职业:IT
年龄:每年大一岁
位置:地球
个性介绍:挺笨
Email: bilbo0214@163.com
|| << >> ||
我的分类


quicksort in OCaml
(* 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

发表于: 2008-06-06,修改于: 2008-06-06 22:00,已浏览225次,有评论2条 推荐 投诉


网友评论
网友: xfzhu2003 时间:2008-09-15 00:02:30 IP地址:124.200.56.★
u coded it by urself?

网友: bilbo0214 时间:2008-09-15 10:28:22 IP地址:123.118.17.★
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.

 发表评论