Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 根据Scheme中的第二个元素对成对列表进行排序_List_Sorting_Scheme - Fatal编程技术网

List 根据Scheme中的第二个元素对成对列表进行排序

List 根据Scheme中的第二个元素对成对列表进行排序,list,sorting,scheme,List,Sorting,Scheme,有没有人能给我一些建议,告诉我如何编写代码,根据每一对的第二个元素按递增顺序对一组对进行排序?我没有一个例子给你,但这似乎是一个简单的事情想象 让我们试着写一个合并排序 (define (mgsort ls cmp) (cond ((or (null? ls) (null? (cdr ls))) ls) ; right? ... then, (else (split ls '() '() cmp)))) 处理列表的最基本工具是结构递归:

有没有人能给我一些建议,告诉我如何编写代码,根据每一对的第二个元素按递增顺序对一组对进行排序?我没有一个例子给你,但这似乎是一个简单的事情想象

让我们试着写一个合并排序

(define (mgsort ls cmp)
  (cond
    ((or (null? ls) (null? (cdr ls)))
       ls)
    ; right? ... then,
    (else 
      (split ls '() '() cmp))))
处理列表的最基本工具是结构递归:

(define (split ls a b cmp)
  (cond 
    ((null? ls) 
       (merge (mgsort a cmp) (mgsort b cmp) cmp))
    (else
       (split (cdr ls) b (cons (car ls) a) cmp))))
现在剩下的就是编写
merge
——一个将合并的函数,就像“zipping”一样,它的两个参数是排序列表,因此结果也是一个排序列表

(define (merge a b cmp)
  (cond 
    ((null? a) b)
    ((null? b) ....)
    ((cmp (car a) (car b))   ; right?
       (cons   
          ... ;; what? ... with what??
          (merge (cdr a) ......)))
    (else
       (cons
          ... 
          (merge a ......)))))
测试:

(mgsort (list 3 1 5 4 6 2 3) <)
;Value 12: (1 2 3 3 4 5 6)

(mgsort (list (cons 3 1) (cons 4 5) (cons 6 2)) (lambda(a b) (< (cdr a) (cdr b))))
;Value 13: ((3 . 1) (6 . 2) (4 . 5))

(mgsort(列表3 1 5 4 6 2 3)是否有人可以在不使用内置scheme函数的情况下编写此函数?还是不可能?@JohnFriedrich:step 1)编写一个带有“cmp”参数的排序函数。步骤2)使用比较列表第二个元素的“cmp”参数调用它。因此,你的问题简单地归结为,如何在scheme中编写排序函数?@JohnFriedrich有比O(n²)更快的排序算法,因此不必非常失望。(最快的有O(n log n)最坏的时间;我相信再快也不可能了。)@ChrisJester Young你肯定忘了……:)谢谢,这看起来更像是我能理解的东西,因为我对这个计划比较陌生。