Ракетка - сортировка списка строк по возрастанию в алфавитном порядке - PullRequest
0 голосов
/ 29 октября 2019

Итак, я пытаюсь написать свою собственную функцию сортировки, которая переставляет свои элементы в возрастающем алфавитном порядке. Например:

(check-expect (sort-list (list "ABD" "ABC" "BCE" "ADE") 0) 
              (list "ABC" "ABD" "ADE" "BCE"))

Ниже приведено то, что у меня есть:

(define (sort-list lst n)
  (cond
    [(empty? lst) empty]
    [else
     (cons
      (cond
       [(> (substring (first lst) n (+ n 1)) (substring (first (rest lst)) n (+ n 1))) (first (rest lst))]
       [else (sort-list (rest lst) (+ n 1))]))]))

Может ли кто-нибудь помочь мне изменить мой код, чтобы он мог работать надлежащим образом?

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете использовать сортировку вставок. Сначала я использовал бы вспомогательную функцию insert, код которой показан ниже.

(define (insert los sorted-los)
  (cond [(empty? sorted-los) (list los)]
        [(string<=? los (first sorted-los))
         (cons los sorted-los)]
        [else (cons (first sorted-los)
                    (insert los (rest sorted-los)))]))

Затем я бы определил основную функцию следующим образом: (define (sort-list los) (cond [(empty? Los))пусто] [else (insert (first los) (sort-list (rest los)))))).

Вам не нужен дополнительный параметр n, и вам не нужно использовать толькоодна функция, хотя вы могли бы определить функцию вставки внутри функции sort, используя тоже local.

Код также удовлетворяет некоторым тестам, как показано ниже.

(check-expect (sort-list (list "ABD" "ABC" "BCE" "ADE"))
              (list "ABC" "ABD" "ADE" "BCE"))

(check-expect (sort-list (list "ABF" "ABC" "BCE" "ADE"))
              (list "ABC" "ABF" "ADE" "BCE"))
(check-expect (sort-list (list "ABD" "ABC" "BCE" "EFG"))
              (list "ABC" "ABD" "BCE" "EFG"))

(check-expect (sort-list (list "ABC" "ABC" "BCG" "ADE"))
              (list "ABC" "ABC" "ADE" "BCG"))
...