CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   Fluent UDF and Scheme Programming (https://www.cfd-online.com/Forums/fluent-udf/)
-   -   MergeSort with a twist - Scheme (https://www.cfd-online.com/Forums/fluent-udf/94231-mergesort-twist-scheme.html)

ydan87 November 9, 2011 18:48

MergeSort with a twist - Scheme
 
Hello there,
I would like to implement MergeSort numbers given in a list, but following the following algorithm:
1) break the given list into list of lists, with a single number in each list (i.e. from (5 2 6) to ((5) (2) (6)))

2) iterate over the list of lists - merge each 2 adjacent lists and create a list of the results (example: from ((5) (2) (7) (1)) to ((5 2) (7 1)) or from ((5) (2) (7)) to ((5 2) (7)))

3) repeat step 2 until there is only one element in the list, which is the sorted list.

4) return it.

here's my suggestion code, what's wrong with it :(?
Code:

(define (fasterMergeSort lst)
  (define (break lst)
    (if (null? lst) ()
        (cons (list (car lst)) (break (cdr lst)))))
  (define (merge lst1 lst2)
    (cond ((null? lst1) (car lst2))
          ((null? lst2) (car lst1))
          ((< (car lst1) (car lst2)) (list (car lst1) (merge (cdr lst1) lst2)))
          (else (list (car lst2) (merge lst1 (cdr lst2))))))
  (define (iter lst)
    (cond ((null? lst) ())
          ((= (length lst) 1) lst)
          (else (cons (merge (car lst) (cadr lst)) (iter (cddr lst))))))
  (cond ((null? lst) 'no-list)
        ((= (length lst) 1) lst)
        (else (let* ((lstBroken (break lst)) (mergeBrokenLst (merge (car lstBroken)(cdr lstBroken))))
                (if (= (length mergeBrokenLst) 1) mergeBrokenLst
                    (iter mergeBrokenLst))))))


Thanks in advance


All times are GMT -4. The time now is 13:54.