2011-10-22 5 views
1

私はベクトルを持っています、各ベクトルの要素はリストです、私はリストの長さに関して要素をソートしたいです。私は私のベクトルをソートするために、これを使用していますが、私はエラーを得た。これは、エラー信号表現であるマージソートを使用するスキームベクトル

(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))) 

答えて

2

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

機能<は、最初の引数として実数を期待したが、得ましたリスト。 ベクトルvecにはリストが含まれているため、式(vector-ref vec left) はリストであり、数値ではありません。

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

代わりにリスト自身のリストの長さを比較するために:あなたは、リストの長さ 後にソートしたいので、次のように記述する必要があります。

注:Schemeの実装には、おそらくライブラリ内にベクターソート機能があります。 R6RSの手順は、procが二つの要素及びベクトルを比較するために使用される手順である

(vector-sort! proc vector) 

をソートするベクトルであるベクトルソート!:呼ばれます。

このように、ユーザーが定義した場合:

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

あなたはthusly

(vector-sort! compare vector) 
それを並べ替えることができます