2013-10-09 124 views
4
排序

我写一个递归码冒泡排序(从小到大通过交换)
我有一个代码做冒泡排序只是一次泡泡方案

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

如果我把一张表这(8 9 4 2 6 7)) - >'(8 4 2 6 7 9)

现在我是代码,它返回最后一个号码列表
EX试图写一个代码来做(泡泡L)N次(列表中的整数数量)
我有这个公司de:

(define (bubble-sort-aux N L) 
    (cond ((= N 1) (bubble-up L)) 
     (else (bubble-sort-aux (- N 1) L) 
    (bubble-up L)))) 
(bubble-sort-aux 6 (list 8 9 4 2 6 7)) -> ' (8 4 2 6 7 9) 

但是递归似乎没有发生,因为它只排序一次!
任何建议将受到欢迎,我只是难住!

+0

“我正在写一个递归代码到Bubble Sort” - 不要! –

+1

@MitchWheat AveryPoole在Scheme中编写,其中tail-call优化是由规范强制的。迭代通常是通过Scheme中的尾递归实现的。 Recation _is_是在Scheme中实现这一点的自然事物。 –

+0

有没有其他方法?刚开始编写代码,尾递归是我学到的唯一方法。 @MitchWheat –

回答

5

试试这个:

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

如果你把“起泡了”的名单N时候,它会在年底进行排序。你的代码的问题在于你没有使用bubble-up的结果 - 但是如果我们将bubble-up返回的值传递给函数的下一个调用,它最终将被排序。现在的程序按预期工作:

(bubble-sort-aux 6 (list 8 9 4 2 6 7)) 
=> '(2 4 6 7 8 9) 
+1

谢谢一吨奥斯卡!我认为我有点被烧毁,那是一个很大的错误=/ –

+0

@AveryPoole欢迎你!总是我的快乐:) –

0

我的实现:

(define (bubble-swap ls) 
    (if (null? (cdr ls)) 
     ls 
     (if (> (car ls) (cadr ls)) 
      (cons (cadr ls) (bubble-swap (cons (car ls) (cddr ls)))) 
      (cons (car ls) (bubble-swap (cdr ls)))))) 

(define (len ls) 
    (if (null? ls) 
     0 
     (+ 1 (len (cdr ls))))) 

(define (bubblesort_ ls n) 
    (if (= n 1) 
     ls 
     (bubblesort_ (bubble-swap ls) (- n 1)))) 

(define (bubblesort ls) (bubblesort_ ls (len ls))) 

我实现了自定义功能len但如果可用,您可以使用标准length功能。