2007-04-21
■libcでqsort()を再帰を使って実装してる香具師は怠慢だろ…常識的に考えて
タイトルは釣り。でもこの件は納得のいく答えがほしかったり。
はじめに
大学の頃アルゴリズムに関する教科書に書かれていたクイックソートの実装の過程に感動した記憶がある。
分割統治法によってソートを進めていくクイックソートを実装するにあたり、最初の実装では関数を再帰で呼び出していく、まあ最初はそれを思いつくよなという展開だったわけだが、次にアルゴリズムの特徴から、「実は再帰を使わなくてもいい」ことが解説され、非再帰に置き換えた実装も提示されていた。
そのとき「libcのqsort()はどんな実装になっているんだろう?」と興味を持ち、LinuxのglibcとFreeBSDのlibcを調べたことがあった。
あれから5年以上たって、そのときの結果を忘れてしまっていたので、改めて調べてみた。
再帰を使っていない実装
再帰を使っている実装
- BSD系
- http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/qsort.c
- http://www.jp.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/lib/libc/stdlib/qsort.c?rev=1.13&content-type=text/plain
- http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdlib/qsort.c
- http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/lib/libc/stdlib/qsort.c?rev=1.14&content-type=text/plain
- http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/qsort.c
- http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/qsort.c?rev=1.10&content-type=text/x-cvsweb-markup
- いずれも/* Iterate rather than recurse to save stack space */というコメントを含むのが特徴
- Solaris
- Perl
その他
- 再帰処理のクイックソート vs 非再帰処理のクイックソート :: Drk7jpによると、再帰で実装されているPerlのsort()は、PurePerlで実装しなおした非再帰ソートよりも遅い(!!)
- コメント中にSedgewickの名前を出しているコードは大体が非再帰
- 例外もあり
- 15 http://lists.debian.or.jp/debian-users/200704/msg00200.html
- 11 http://mlog.euqset.org/archives/debian-users/48451.html
- 4 http://d.hatena.ne.jp/keyworddiary/Ruby
- 3 http://www.drk7.jp/MT/archives/000995.html
- 2 http://72.14.235.104/search?q=cache:yj82cyOdHvkJ:d.hatena.ne.jp/n2s/20070413/p1+mysql+アップグレード+debian&hl=ja&ct=clnk&cd=1&gl=jp
- 2 http://d.hatena.ne.jp/asin/4839904545
- 2 http://reader.livedoor.com/reader/
- 2 http://search.yahoo.co.jp/search?p=Debian+mysqld.sock+error&ei=UTF-8&fr=top&x=wrt
- 2 http://search.yahoo.co.jp/search?p=IE6とIE7を共存&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1
- 2 http://search.yahoo.co.jp/search?p=STOPPING+server+from+pid+file&ei=UTF-8&fr=top_v2&x=wrt&meta=vc=