2011-10-22 5 views
1

J'ai un vecteur, les éléments de chaque vecteur sont une liste, je veux trier les éléments concernant la longueur de la liste. J'utilise ceci pour trier mon vecteur mais je suis l'erreurSchéma vecteur utilisant le tri de fusion

(define vector-merge! 
    (lambda (newvec vec left group-size vec-size) 
     (let* ((top-left (min vec-size (+ left group-size))) 
      (right top-left) 
      (top-right (min vec-size (+ right group-size)))) 
     (let mergeloop ((left left) (right right) (i left)) 
       (cond ((and (< left top-left) (< right top-right)) 
         (if (< (vector-ref vec left) (vector-ref vec right)) 
         (begin 
          (vector-set! newvec i (vector-ref vec left)) 
          (mergeloop (add1 left) right (add1 i))) 
         (begin 
          (vector-set! newvec i (vector-ref vec right)) 
          (mergeloop left (add1 right) (add1 i))))) 
       ((< left top-left) 
        (vector-set! newvec i (vector-ref vec left)) 
        (mergeloop (add1 left) right (add1 i))) 
       ((< right top-right) 
        (vector-set! newvec i (vector-ref vec right)) 
        (mergeloop left (add1 right) (add1 i)))))))) 

    (define vector-mergesort! 
    (lambda (orig-vec) 
     (let* ((vec-size (vector-length orig-vec)) 
      (new-vec (make-vector vec-size))) 
     ;; merge with successively larger group sizes 
     (do ((group-size 1 (* group-size 2)) ;; loop variables 
     (twice-size 2 (* twice-size 2)) 
     (count 1 (add1 count)) 
     (vec1 orig-vec vec2) 
     (vec2 new-vec vec1)) 
     ((>= group-size vec-size)   ;;; exit condition 
      (if (even? count)    ;;; copy to orig-vec, if needed 
        (do ((i 0 (add1 i))) ;;; this do replaces 
         ((>= i vec-size)) ;;; vector-change! 
         (vector-set! orig-vec i (vector-ref new-vec i))))) 
     ;; successively merge next two groups 
     (do ((left 0 (+ left twice-size))) ;; loop variables 
      ((>= left vec-size))    ;; exit when array processed 
      (vector-merge! vec2 vec1 left group-size vec-size)))))) 



Error: 
<: expects type <real number> as 1st argument, given: ((length (vector-ref route number))); other arguments were: ((length (vector-ref route number))) 

Répondre

2

Ceci est l'expression qui signale une erreur:

(< (vector-ref vec left) (vector-ref vec right)) 

La fonction < attend un nombre réel comme premier argument, mais j'ai reçu une liste. Puisque votre vecteur vec contient des listes, l'expression (vector-ref vec left) renvoie une liste (et non un nombre). Puisque vous voulez trier après la longueur des listes, vous devez écrire:

(< (length (vector-ref vec left)) (length (vector-ref vec right))) 

afin de comparer la longueur des listes au lieu des listes elles-mêmes.

Remarque: L'implémentation de votre schéma a très probablement une fonction de tri de vecteur dans sa bibliothèque. Dans R6RS la procédure est appelée vecteur tri !:

(vector-sort! proc vector) 

où proc est une procédure utilisée pour comparer deux éléments et vecteur est le vecteur à trier.

Ainsi, si vous définissez:

(define (compare list1 list2) 
    (< (length list1) (length list2))) 

vous pouvez trier thusly

(vector-sort! compare vector)