2014-09-05 2 views
1

Я пытаюсь написать рекурсивную функцию сортировки, сортирующую список от низкого до высокого (duh). В настоящее время я получаю вывод, а не правильный вывод. Вот мой код:Clojure - функция сортировки

(defn sort/predicate [pred loi] 
    (if (empty? loi) 
    () 
    (if (= (count loi) 1) 
     (cons (first loi) (sort pred (rest loi))) 
     (if (pred (first loi) (first (rest loi))) 
     (cons (first loi) (sort pred (rest loi))) 
     (if (pred (first (rest loi)) (first loi)) 
      (cons (first (rest loi)) (sort pred (cons (first loi) (rest (rest loi))))) 
      (cons (first loi) (sort pred (rest loi)))))))) 

В принципе, я сравниваю первые два элемента в списке и, если первый элемент меньше I против его с результатом сравнения двух следующих элементов списка. Если второй элемент списка меньше, я минус второй элемент с результатом сортировки первых двух элементов минусов первого элемента и всего после второго элемента (извините, если это трудно выполнить). Затем, когда в списке остается только один элемент, я бросаю его в конец и возвращаю. Тем не менее, есть ошибка по пути куда-то, потому что я должен получить следующее:

>(sort/predicate < '(8 2 5 2 3)) 
(2 2 3 5 8) 

, но вместо этого, я получаю:

>(sort/predicate < '(8 2 5 2 3)) 
(2 5 2 3 8) 

Я довольно новыми для Clojure, так что любая помощь сильно оценили. Кроме того, я хотел бы сохранить код примерно одинаковым (я не хочу использовать функцию сортировки, которая уже существует). Thanks

+0

Я просто понял, что я только когда-либо сравнивать первые два элементы. –

ответ

-2

clojure.core/sort реализация Java более общая.

user=> (sort '(8 2 5 2 3)) 
(2 2 3 5 8) 
user=> (sort > '(8 2 5 2 3)) 
(8 5 3 2 2) 
user=> (source sort) 
(defn sort 
    "Returns a sorted sequence of the items in coll. If no comparator is 
    supplied, uses compare. comparator must implement 
    java.util.Comparator. If coll is a Java array, it will be modified. 
    To avoid this, sort a copy of the array." 
    {:added "1.0" 
    :static true} 
    ([coll] 
    (sort compare coll)) 
    ([^java.util.Comparator comp coll] 
    (if (seq coll) 
    (let [a (to-array coll)] 
     (. java.util.Arrays (sort a comp)) 
     (seq a)) 
    ()))) 
nil 
user=> 
1

Я не думаю, что это очень эффективный способ сортировки, но я старался оставаться верным своим намерением:

(defn my-sort [cmp-fn [x & xs]] 
    (cond 
    (nil? x) '() 
    (empty? xs) (list x) 
    :else (let [[y & ys :as s] (my-sort cmp-fn xs)] 
      (if (cmp-fn x y) 
       (cons x s) 
       (cons y (my-sort cmp-fn (cons x ys))))))) 
+0

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

+0

@ChrisPhillips Не оставляйте лишние вопросы висящими. Если у вас есть хороший ответ, отправьте его и примите его. Даже если ваша вставка была исправлена ​​здесь, это так же сложно, как и слияние, которое, как вы нашли, является основой более простого более простого алгоритма. Вы можете аннотировать вопрос соответствующим образом. – Thumbnail

Смежные вопросы