答えて
SRFI 95ソートライブラリを提供します。多くのScheme実装ではソートライブラリも組み込まれていますが、それらのすべてがSRFI 95インターフェイスに準拠しているわけではありません。あなたは(宿題のために、と言う)独自の実装を記述する必要がある場合は
することは、あなたはマージソートやクイックソートのような標準的なソートアルゴリズムのいずれかを使用する必要があります。しかし、これらのアルゴリズムはどちらもベクトルベースのアルゴリズムなので、リストをベクトルにコピーして並べ替え、リストに戻してコピーする必要があります。ベクトル操作操作に便利なSRFI 43があります。特にベクトルの2つの要素を交換するのにvector-swap!
が役に立ちます。
リンクされたリストを直接ソートするのに適したアルゴリズムがあります。私は彼らと一緒にいるわけではないので、私はそれ以上コメントしません。
mergesortとquicksortの両方をリストで簡単に実装できますが、リストをトラバースする必要があるいくつかの箇所で少しのパフォーマンスを失う可能性があります(同じ数の比較を維持していますが)。 – erjiang
ほとんどのSchemeの実装には、リストをソートするプロシージャが付属しています。あなたの実装がそれを提供しない場合、それをあなたの上で動かすことは困難ではありません。ここでは、クイックソートアルゴリズムの実装です:
> (define (qsort e)
(if (or (null? e) (<= (length e) 1)) e
(let loop ((left null) (right null)
(pivot (car e)) (rest (cdr e)))
(if (null? rest)
(append (append (qsort left) (list pivot)) (qsort right))
(if (<= (car rest) pivot)
(loop (append left (list (car rest))) right pivot (cdr rest))
(loop left (append right (list (car rest))) pivot (cdr rest)))))))
> (qsort '(1 3 5 2 9))
=> (1 2 3 5 9)
このプログラムの仕組みについて少し詳しく説明できますか?私はこれまでのような仕事をしたことは一度も見ていません。それはletの後にループ全体のコードがあるように見えるので、なぜラムダを使用しないのですか?私はなぜletが使われているのか分からない。 –
- 1. スキーム:リスト
- 2. スキーム:リスト
- 3. スキームの引用式のリストのリスト
- 4. スキーム内のリストの長さ
- 5. スキームの(ポイントの)座標を保存しソートする方法は?
- 6. リストをソート
- 7. ヌル値でリストをソートする
- 8. JavaScriptでリストをソートする方法は?
- 9. C#でリストをソートする方法
- 10. Python:リストのリストをソート
- 11. Python:並行リストでリストをソート
- 12. Javaで配列リストをソート
- 13. WCFでソート可能なリスト
- 14. カスタムクラスを含むリストをソートする
- 15. セットを使用せずにリストを更新する! - スキーム
- 16. ファイル://スキームをコンテンツに変換する//スキーム
- 17. スキーム:レコードのリストへの追加
- 18. 再帰とスキームのリストの返却
- 19. 一覧のリストの作成(スキーム)?
- 20. リストをソートするリフレクションgetオブジェクトのプロパティ
- 21. このリストをソートする方法は?
- 22. リストをソートする__lt__の実装
- 23. スキーム:ネストされたリストから要素を取得する
- 24. ハスケル:リストにカスタム順序を適用する(リストのリストをソートする)
- 25. ディクショナリとリストで異なるソート順序
- 26. カスタムオブジェクトのリストのソート
- 27. Vimの:ソートToDoリスト
- 28. ハスケルデータ型ソートのリスト
- 29. iPhone - リカレントイベントのリストをソート
- 30. 選択DLinkedリストをソート
質問はすでにスタックオーバーフローで尋ねられました。 http://stackoverflow.com/questions/2527150/scheme-sorting-a-list – joce