2016-10-15 5 views
2

Я работаю над сортировкой списка списков по их первому элементу, например
(сортировать (список '(2 1 6 7)' (4 3 1 2 4 5) '(1 1))))Сортировка списка списков по их первому элементу в схеме

ожидается выход => (' (1 1) '(2 1 6 7)' (4 3 1 2 4 5))

алгоритм я использовал пузырь Сортировать. И я изменил его, чтобы иметь дело со списками. Однако код не компилируется. Ошибка

mcar: contract violation 
    expected: mpair? 
    given: 4 

Может кто-то исправить мой код и объяснить его. Спасибо

(define (bubble L) 
     (if (null? (cdr L)) 
      L  
      (if (< (car (car L)) (car (cadr L))) 
       (list (car L) 
         (bubble (car (cdr L)))) 
       (list (cadr L) 
         (bubble (cons (car (car L)) (car (cddr L)))))))) 

    (define (bubble-sort N L)  
     (cond ((= N 1) (bubble L)) 
       (else 
       (bubble-sort (- N 1) (bubble L))))) 

    (define (bubble-set-up L) 
     (bubble-sort (length L) L)) 


    (define t3 (list '(2 1 6 7) '(4 3 1 2 4 5) '(1 2 3) '(1 1))) 
    (bubble-set-up t3) 

ответ

2

Я исправил несколько ошибок. По крайней мере одна ошибка. Рассмотрите тот случай, когда L содержит только один элемент.

#lang r5rs 

(define (bubble L) 
    (if (null? (cdr L)) 
     L  
     (if (< (car (car L)) (car (cadr L))) 
      (cons (car L) 
       (bubble (cdr L))) 
      (cons (cadr L) 
       (bubble (cons (car L) (cddr L))))))) 

(define (bubble-sort N L)  
    (cond ((= N 1) (bubble L)) 
     (else 
     (bubble-sort (- N 1) (bubble L))))) 

(define (bubble-set-up L) 
    (bubble-sort (length L) L)) 


(define t3 (list '(2 1 6 7) '(4 3 1 2 4 5) '(1 2 3) '(1 1))) 
(display (bubble-set-up t3)) 
(newline) 
2

Как насчет (sort (lambda (x y)(< (car x)(car y))) <YOUR_LIST>)?