descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
リストのソートを高速で行うプログラムを作成します。
ソートのアルゴリズムは、クイック・ソートを使います。
// リストのクイック・ソートのプログラム // リストの追加処理:appendの処理 #xは()と#xのリスト追加です。 #zは#xと#yのリスト追加のとき、 (#a:#z)が(#a:#x)と#yのリスト追加です。 // quick sortの処理 ()は、()のクイック・ソートである。 #xは、#listと#l1と#l2のqsplitであり、 #s1は、#l1のクイック・ソートであり、 #s2は、#l2のクイック・ソートであり、 #sは、#s1と(#x : #s2)のリスト追加である場合、 #sは、(#x : #list)のクイック・ソートである。 // 値の大小によるリストの分割処理 _は、()と()と()のqsplitです。 #y <= #xが成立し、 #xは、#listと#l1と#l2のqsplitである場合、 #xは、(#y : #list)と(#y : #l1)と#l2のqsplitです。 #xは、#listと#l1と#l2のqsplitである場合、 #xは、(#y : #list)と#l1と(#y : #l2)のqsplitです。 // 実行 #xは、(11 12 3 7 1 2 0 -1 10 9 4 8 5 6)のクイック・ソートですか?
このプログラムでは、リストの追加処理であるappend相当の処理を、リスト追加として最初に定義しています。
メインの処理は、クイック・ソートにより定義します。
さらに、クイックソートの中で、リストの分割処理のためにqsplitを定義しています。
さっそく実行してみましょう。
上のプログラムはsamples/qsort.mrsに入っているとします。
$ descartes murasaki samples/qsort.mrs #xは、(11 12 3 7 1 2 0 -1 10 9 4 8 5 6)のクイック・ソートですか? (-1 0 1 2 3 4 5 6 7 8 9 10 11 12)は、(11 12 3 7 1 2 0 -1 10 9 4 8 5 6)のクイック・ソートです。
正しくソートされてますね。
このプログラムは次に示すようなデカルト言語のプログラムにコンパイルされて実行されたものです。
<M2 リスト追加 #x (() #x)> ; <M2 リスト追加 (#a:#z) ((#a:#x) #y)> <M2 リスト追加 #z (#x #y)> ; <M2 クイック・ソート () (())> ; <M2 クイック・ソート #s ((#x : #list))> <M2 qsplit #x (#list #l1 #l2)> <M2 クイック・ソート #s1 (#l1)> <M2 クイック・ソート #s2 (#l2)> <M2 リスト追加 #s (#s1 (#x : #s2))> ; <M2 qsplit _ (() () ())> ; <M2 qsplit #x ((#y : #list) (#y : #l1) #l2)> <compare #y <= #x> <M2 qsplit #x (#list #l1 #l2)> ; <M2 qsplit #x ((#y : #list) #l1 (#y : #l2))> <M2 qsplit #x (#list #l1 #l2)> ; ? <printf '#xは、(11 12 3 7 1 2 0 -1 10 9 4 8 5 6)のクイック・ソートですか?' <\_n>>; ? <回答 (<M2 クイック・ソート #x ((11 12 3 7 1 2 0 -1 10 9 4 8 5 6))>)>; ? <print>;
--
--
[PageInfo]
LastUpdate: 2011-09-07 02:34:38, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users