Advertisement
Guest User

Untitled

a guest
Nov 13th, 2017
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Удаление из списка элемента с заданным номером
  2.  
  3. (define (delete_element_by_number curr_number lst)
  4.   (cond
  5.    ((= curr_number 1) (rest lst))
  6.    (true (cons (first lst) (delete_element_by_number (- curr_number
  7.        1)
  8.       (rest lst))))))
  9.  
  10. ; Поиск элемента по заданному номеру
  11.  
  12. (define (find_element_by_number num lst)
  13.   (cond
  14.    ((= num 1) (first lst))
  15.    (true (find_element_by_number (- num 1) (rest lst)))))
  16.  
  17. ; Формирование списка элементов, отстоящих друг от друга на заданное
  18. ; расстояние
  19.  
  20. (define (group_build lst lst_len step curr_number)
  21.   (cond
  22.    ((> curr_number lst_len) '())
  23.    (true (sifting (find_element_by_number curr_number lst) (group_build
  24.       lst lst_len step
  25.       (+ curr_number step))))))
  26.  
  27. ; Группировка элементов, отстоящих друг от друга на заданное расстояние
  28.  
  29. (define (grouping lst lst_len step curr_elem_number)
  30.   (cond
  31.    ((> curr_elem_number step) '())
  32.    (true (cons (group_build lst lst_len step curr_elem_number) (grouping
  33.       lst lst_len step
  34.       (+ curr_elem_number 1))))))
  35.  
  36. ; Запуск процедуры вставки списка в список
  37.  
  38. (define (insert_list_to_list lst1 step lst2)
  39.   (insert_list_to_list_step_n lst1 step 1 lst2))
  40.  
  41. ; Вставка элементов одного списка в другой с заданным интервалом
  42.  
  43. (define (insert_list_to_list_step_n lst step cnt ins_list)
  44.   (cond
  45.    ((null? lst) ins_list)
  46.    ((null? ins_list) lst)
  47.    ((< cnt step) (cons (first lst) (insert_list_to_list_step_n (rest
  48.        lst) step
  49.       (+ cnt 1) ins_list)))
  50.    ((= step cnt) (cons (first lst) (cons (first ins_list) (insert_list_to_list_step_n
  51.        (rest lst) step 1
  52.        (rest ins_list)))))))
  53.  
  54. ; Запуск процедуры вставки списка в список
  55.  
  56. (define (insert_lists_to_list lst_arg group_list)
  57.   (insert_lists_to_list_start lst_arg 1 group_list))
  58.  
  59. ; Вставка элементов списков в список с изменяющимся шагом
  60.  
  61. (define (insert_lists_to_list_start lst_arg step group_list)
  62.   (cond
  63.    ((null? group_list) lst_arg)
  64.    (true (insert_lists_to_list_start (insert_list_to_list lst_arg
  65.       step
  66.       (first group_list))
  67.      (+ step 1)
  68.      (rest group_list)))))
  69.  
  70. ; Проход сортировки Шелла для заданного шага
  71.  
  72. (define (one_prohod lst lst_len step)
  73.   (append (insert_lists_to_list (first (grouping lst lst_len step
  74.       1))
  75.     (rest (grouping lst lst_len step 1)))
  76.    (rest_of_list_from_nth_to_end lst (length (insert_lists_to_list
  77.       (first (grouping lst lst_len step 1))
  78.       (rest (grouping lst lst_len step 1)))))))
  79.  
  80. ; Удаление из исходного списка элементов, отстоящих друг от друга на заданное
  81. ; расстояние
  82.  
  83. (define (rest_of_list lst lst_len step curr_number)
  84.   (cond
  85.    ((> curr_number lst_len) lst)
  86.    (true (rest_of_list (delete_element_by_number curr_number lst)
  87.      (- lst_len 1) step
  88.      (- (+ curr_number step) 1)))))
  89.  
  90. ; Выделение в список всех элементов, начиная с (n+1)-го
  91.  
  92. (define (rest_of_list_from_nth_to_end lst n)
  93.   (cond
  94.    ((= n 1) (rest lst))
  95.    (true (rest_of_list_from_nth_to_end (rest lst) (- n 1)))))
  96.  
  97. ; Выполнение сортировки Шелла для заданного списка шагов
  98.  
  99. (define (shell_sort lst lst_len step_list)
  100.   (cond
  101.    ((null? step_list) lst)
  102.    (true (shell_sort (one_prohod lst lst_len (first step_list)) lst_len
  103.      (rest step_list)))))
  104.  
  105. ; Запуск сортировки Шелла
  106.  
  107. (define (shell_sort_start lst)
  108.   (shell_sort lst (length lst) (my_reverse (steplist (length lst) 0))))
  109.  
  110. ; Вставка элемента в список путем просеивания
  111.  
  112. (define (sifting elem lst)
  113.   (cond
  114.    ((null? lst) (cons elem '()))
  115.    ((<= elem (first lst)) (cons elem lst))
  116.    (true (cons (first lst) (sifting elem (rest lst))))))
  117.  
  118. ; Сортировка списка просеиванием
  119.  
  120. (define (sifting_sort lst)
  121.   (cond
  122.    ((null? lst) '())
  123.    (true (sifting (first lst) (sifting_sort (rest lst))))))
  124.  
  125. ; Формирование списка шагов
  126.  
  127. (define (steplist length_of_list s)
  128.   (cond
  129.    ((and (> (mod s 2) 0) (<= (* 3 (+ 1 (- (* 8 (pow 2 s)) (* 6 (pow
  130.            2
  131.            (/ (+ s 1) 2)))))) length_of_list))
  132.     (cons (+ 1 (- (* 8 (pow 2 s)) (* 6 (pow 2 (/ (+ s 1) 2))))) (
  133.       steplist length_of_list
  134.       (+ s 1))))
  135.    ((and (= (mod s 2) 0) (<= (* 3 (+ 1 (- (* 9 (pow 2 s)) (* 9 (pow
  136.            2
  137.            (/ s 2)))))) length_of_list))
  138.     (cons (+ 1 (- (* 9 (pow 2 s)) (* 9 (pow 2 (/ s 2))))) (steplist
  139.       length_of_list
  140.       (+ s 1))))
  141.    ((and (> (mod s 2) 0) (> (* 3 (+ 1 (- (* 8 (pow 2 s)) (* 6 (pow
  142.            2
  143.            (/ (+ s 1) 2)))))) length_of_list)) '())
  144.    ((and (= (mod s 2) 0) (> (* 3 (+ 1 (- (* 9 (pow 2 s)) (* 9 (pow
  145.            2
  146.            (/ s 2)))))) length_of_list)) '())))
  147.  
  148. ; реверсирование
  149.  
  150. (define (my_rev lst1 lst2)
  151.  (cond
  152.        ((null? lst1) lst2)
  153.        (true (my_rev (rest lst1) (cons (first lst1) lst2)))
  154.  )
  155. )
  156. (define (my_reverse lst)
  157.  (my_rev lst '())
  158. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement