Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Add slides for lecture #5

  • Loading branch information...
commit c170caafd4ce7d9223e664b1b904953cf06b7f3b 1 parent d2357ce
Nikolay Bachiyski nb authored

Showing 2 changed files with 151 additions and 0 deletions. Show diff stats Hide diff stats

  1. +147 0 lectures/05-game-of-qsort.lecture
  2. +4 0 lectures/index.yml
147 lectures/05-game-of-qsort.lecture
... ... @@ -0,0 +1,147 @@
  1 += qsort
  2 +== бързо и лесно!
  3 +
  4 +* Стар и красив алгоритъм
  5 +* `O(n×log₂(n))` в средния, `O(n²)` в най-лошия случай
  6 +* Все пак в повечето случаи е по-бърз от другите логаритмични
  7 +* Разделяй и владей
  8 +* На всяка стъпка избираме случаен елемент – пивот
  9 +* Намираме всички елементи, които са по-малки от него и ги сортираме със същия алгоритъм
  10 +* Намираме всички елементи, които са по-големи или равни от него и ги сортираме със същия алгоритъм
  11 +* *сортирани по-малки* пивот *сортитани по-големи*
  12 +
  13 += qsort
  14 +== имплементация
  15 +
  16 +:annotate
  17 +
  18 + (defn qsort [xs]
  19 + (if (seq xs)
  20 + (let [pivot (first xs)
  21 + smaller? #(< % pivot)
  22 + xs (rest xs)]
  23 + (concat
  24 + (qsort (filter smaller? xs))
  25 + [pivot]
  26 + (qsort (remove smaller? xs))))
  27 + xs))
  28 +
  29 + (qsort [7 9 -1 3 61 8]) ; =>
  30 +
  31 += qsort
  32 +== лог
  33 +
  34 +:code
  35 + (defn qsort [xs]
  36 + (if (seq xs) (println "qsort" xs))
  37 + (if (seq xs)
  38 + (let [pivot (first xs)
  39 + smaller? #(< % pivot)
  40 + xs (rest xs)]
  41 + (concat
  42 + (qsort (filter smaller? xs))
  43 + [pivot]
  44 + (qsort (remove smaller? xs))))
  45 + xs))
  46 +
  47 + (qsort [7 9 -1 3 61 8]) ; (-1 3 7 8 9 61)
  48 +
  49 += qsort
  50 +== лог
  51 +
  52 +{{{
  53 +<pre>
  54 +qsort [7 9 -1 3 61 8]
  55 +pivot 7
  56 +qsort (-1 3)
  57 +pivot -1
  58 +qsort (3)
  59 +pivot 3
  60 +qsort (9 61 8)
  61 +pivot 9
  62 +qsort (8)
  63 +pivot 8
  64 +qsort (61)
  65 +pivot 61
  66 +</pre>
  67 +}}}
  68 +
  69 += qsort
  70 +== само първите 2
  71 +
  72 +:code
  73 + (take 2 (qsort [7 9 -1 3 61 8])) ; (-1 3 7 8 9 61)
  74 +
  75 +{{{
  76 +<pre>
  77 +qsort [7 9 -1 3 61 8]
  78 +pivot 7
  79 +qsort (-1 3)
  80 +pivot -1
  81 +qsort (3)
  82 +pivot 3
  83 +qsort (9 61 8)
  84 +pivot 9
  85 +qsort (8)
  86 +pivot 8
  87 +qsort (61)
  88 +pivot 61
  89 +</pre>
  90 +}}}
  91 +
  92 += qsort
  93 +== lazy
  94 +
  95 +* за да не смятаме всичко ни трябва итеративен алгоритъм
  96 +* ще представим цялата структура във вида: `(поредица) число (поредица) число … (поредица)`
  97 +
  98 += qsort
  99 +== lazy имплементация
  100 +
  101 +:annotate
  102 +
  103 + (defn sort-parts [work]
  104 + (lazy-seq
  105 + (loop [[part & parts] work]
  106 + (if-let [[pivot & xs] (seq part)]
  107 + (letfn [(smaller? [x] (< x pivot))]
  108 + (recur (list*
  109 + (filter smaller? xs)
  110 + pivot
  111 + (remove smaller? xs)
  112 + parts)))
  113 + (when-let [[x & parts] parts]
  114 + (cons x (sort-parts parts)))))))
  115 +
  116 + (defn lazy-qsort [xs]
  117 + (sort-parts (list xs)))
  118 +
  119 + (lazy-qsort [7 9 -1 3 61 8]) ; =>
  120 +
  121 +
  122 += qsort
  123 +== lazy имплементация
  124 +
  125 +:code
  126 +
  127 + (defn sort-parts [work]
  128 + (println "lazy" work)
  129 + (lazy-seq
  130 + (loop [[part & parts] work]
  131 + (println "loop" part parts)
  132 + (if-let [[pivot & xs] (seq part)]
  133 + (letfn [(smaller? [x] (< x pivot))]
  134 + (recur (list*
  135 + (filter smaller? xs)
  136 + pivot
  137 + (remove smaller? xs)
  138 + parts)))
  139 + (when-let [[x & parts] parts]
  140 + (cons x (sort-parts parts)))))))
  141 +
  142 + (defn lazy-qsort [xs]
  143 + (sort-parts (list xs)))
  144 +
  145 + (lazy-qsort [7 9 -1 3 61 8]) ; [7 9 -1 3 61 8]
  146 +
  147 +
4 lectures/index.yml
@@ -18,3 +18,7 @@
18 18 title: 04. Опашки, домашни, мързелуване
19 19 date: 2013-03-14
20 20 slug: 04-lazy-homework
  21 +'5':
  22 + title: 05. Game of Life и qsort
  23 + date: 2013-03-19
  24 + slug: 05-game-of-qsort

0 comments on commit c170caa

Please sign in to comment.
Something went wrong with that request. Please try again.