Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2010, 10:54   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Быстрая сортировка на LISP

Добрый день, у меня на учебе начался лисп, необходимо реализовать быструю сортировку, нашла кучу алгоритмов, но не могу их понять, может кто-то сталкивался с подобной задачей и сможешь объяснить что и как нужно сделать? могу выложить примеры прог найденвх мной, чтоб объяснили по ним
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.04.2010, 10:56   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
Добрый день, у меня на учебе начался лисп, необходимо реализовать быструю сортировку, нашла кучу алгоритмов, но не могу их понять, может кто-то сталкивался с подобной задачей и сможешь объяснить что и как нужно сделать? могу выложить примеры прог найденвх мной, чтоб объяснили по ним
Выложите, авось вместе чего и выйдет .

ЗЫ. А на каком факультете на шепелявых (одно из значений lisp - шепелявость) учат ?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.04.2010, 11:48   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

1.
Код:
 (DEFUN FIRST_EL(n lst)
 (COND (( < = n 0) NIL)
       ((NULL lst) NIL)
       (1 (CONS (CAR lst) (FIRST_EL (- n '1) (CDR LST))))
 )
)

(DEFUN LAST_EL(n lst)
 (COND ((<= n 0) LST)
       ((NULL lst) NIL)
       (1 (LAST_EL (- n '1) (CDR LST)))
 )
)

(DEFUN SPLIT(lst)
 (SET 'fi (FIRST_EL (/ (LENGTH lst) 2) lst))
 (SET 'li (LAST_EL  (LENGTH fi) lst))
 (LIST fi li)
)

(DEFUN MERGE(lst1 lst2)
 (COND ((NULL lst1) lst2)
       ((NULL lst2) lst1)
       ((> (CAR lst1) (CAR lst2)) (CONS (CAR lst2) (MERGE lst1 (CDR lst2))))
       (1 (CONS (CAR lst1) (MERGE (CDR lst1) lst2)))
 )
)

(DEFUN SORT(LST)
 (COND ( (eq (LENGTH (CAR (SPLIT LST))) 1) (MERGE (CAR (SPLIT LST)) (CAR(CDR (SPLIT LST)))))
       ( 1 (MERGE (SORT (CAR (SPLIT LST))) (SORT(CAR (CDR (SPLIT LST))))))
 )
)
2.
Код:
(defun my-qsort (list-for-sort sort-fun-less sort-fun-more)
  (if (not list-for-sort) nil
      (append (my-qsort (remove (first list-for-sort) 
                                (rest list-for-sort) 
                                :test sort-fun-less) 
                        sort-fun-less 
                        sort-fun-more)
              (list (first list-for-sort))
              (my-qsort (remove (first list-for-sort) 
                                (rest list-for-sort) 
                                :test sort-fun-more) 
                        sort-fun-less 
                        sort-fun-more))))

;; пару примеров использования

CL-USER> (my-qsort '(3 1 6 3 1 34) #'< #'>=)
(1 1 3 3 6 34)
Факультет механико-математический, предмет называется языки программирования
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.04.2010, 12:47   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
(defun my-qsort (list-for-sort sort-fun-less sort-fun-more)
  (if (not list-for-sort) nil
      (append (my-qsort (remove (first list-for-sort) 
                                (rest list-for-sort) 
                                :test sort-fun-less) 
                        sort-fun-less 
                        sort-fun-more)
              (list (first list-for-sort))
              (my-qsort (remove (first list-for-sort) 
                                (rest list-for-sort) 
                                :test sort-fun-more) 
                        sort-fun-less 
                        sort-fun-more))))
(defun my-qsort (list-for-sort sort-fun-less sort-fun-more)
определим функцию my-sort
list-for-sort - список элементов для сортировки

(if (not list-for-sort) nil
Если список для сортировки не содержит элементы вернем Nil

На большее меня не хватило .
Однако видны рекурсионные вызовы самой себя с перестановкой первого элемента.
list - это создание списка.

Касательно первого случая, то там, ИМХО разбираться проще - составные элементы функции вынесены как самостоятельные - получение первого, последнего элементов, слияние.
COND это вторая форма условия (почти как if).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 14.04.2010 в 12:50.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка Serious Общие вопросы Delphi 2 02.11.2010 13:38
быстрая сортировка настолько быстрая Serg12 Помощь студентам 8 28.03.2010 21:31
Быстрая сортировка lennon Общие вопросы C/C++ 0 08.10.2009 23:23
Быстрая сортировка Syltan Общие вопросы C/C++ 7 18.09.2009 17:35
быстрая сортировка ГРИГОРИЙ-кореш Помощь студентам 1 16.04.2009 18:13