Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 方案中的气泡排序_List_Sorting_Scheme_Bubble Sort - Fatal编程技术网

List 方案中的气泡排序

List 方案中的气泡排序,list,sorting,scheme,bubble-sort,List,Sorting,Scheme,Bubble Sort,我正在编写一个递归代码来进行冒泡排序(通过交换从最小到最大) 我有一个代码只做一次冒泡排序 (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)))) ) ) 但是递归似乎没有发生,因

我正在编写一个递归代码来进行冒泡排序(通过交换从最小到最大)
我有一个代码只做一次冒泡排序

(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))))  
  )
 )  
但是递归似乎没有发生,因为它只排序一次
任何建议都欢迎,我只是被难住了

试试这个:

(define (bubble-sort-aux N L)   
  (cond ((= N 1) (bubble-up L))  
        (else (bubble-sort-aux (- N 1) (bubble-up L)))))  
如果您一直“冒泡”列表,它将在最后排序。您的代码的问题是,您没有使用
冒泡
的结果进行任何操作-但是如果我们将
冒泡
返回的值传递给函数的下一次调用,它最终将被排序。现在程序按预期工作:

(bubble-sort-aux 6 (list 8 9 4 2 6 7))
=> '(2 4 6 7 8 9)
我的实施:

(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
函数。

“我正在编写一个递归代码来进行冒泡排序”-不要@MitchWheat AveryPoole正在编写Scheme,规范规定了尾部调用优化。迭代通常通过Scheme中的尾部递归实现。在方案中实现这一点很自然。是否有其他方法?刚开始编写代码,尾部递归是我学到的唯一方法@MitchWheat@Joshua泰勒:我指的是一般使用BubbleSort。Scheme(至少R5RS)支持
do
迭代构造,但在Scheme中使用尾部递归来表示迭代更为常见。例如,ÓscarLópez的答案表面上是递归的,但由于对
气泡排序aux
的调用处于尾部位置,因此本质上是迭代的。不过,您的
冒泡
不是尾部递归的。你可以考虑尝试让它的尾巴递归,too.谢谢吨奥斯卡!我想我有点累了,这是一个很大的错误=/
(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)))