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

如果我在此代码中放入一个列表,它会返回
EX 末尾具有最大数字的列表。(冒泡'(8 9 4 2 6 7))->'(8 4 2 6 7 9)

现在我正在尝试编写一个代码来执行(冒泡 L)N 次(列表中的整数数)
我有这个代码:

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

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

4

2 回答 2

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)
于 2013-10-09T00:29:16.523 回答
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函数(如果有)。

于 2017-02-27T10:00:54.250 回答