Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add slides for lecture #5

  • Loading branch information...
commit c170caafd4ce7d9223e664b1b904953cf06b7f3b 1 parent d2357ce
@nb nb authored
Showing with 151 additions and 0 deletions.
  1. +147 −0 lectures/05-game-of-qsort.lecture
  2. +4 −0 lectures/index.yml
View
147 lectures/05-game-of-qsort.lecture
@@ -0,0 +1,147 @@
+= qsort
+== бързо и лесно!
+
+* Стар и красив алгоритъм
+* `O(n×log₂(n))` в средния, `O(n²)` в най-лошия случай
+* Все пак в повечето случаи е по-бърз от другите логаритмични
+* Разделяй и владей
+* На всяка стъпка избираме случаен елемент – пивот
+* Намираме всички елементи, които са по-малки от него и ги сортираме със същия алгоритъм
+* Намираме всички елементи, които са по-големи или равни от него и ги сортираме със същия алгоритъм
+* *сортирани по-малки* пивот *сортитани по-големи*
+
+= qsort
+== имплементация
+
+:annotate
+
+ (defn qsort [xs]
+ (if (seq xs)
+ (let [pivot (first xs)
+ smaller? #(< % pivot)
+ xs (rest xs)]
+ (concat
+ (qsort (filter smaller? xs))
+ [pivot]
+ (qsort (remove smaller? xs))))
+ xs))
+
+ (qsort [7 9 -1 3 61 8]) ; =>
+
+= qsort
+== лог
+
+:code
+ (defn qsort [xs]
+ (if (seq xs) (println "qsort" xs))
+ (if (seq xs)
+ (let [pivot (first xs)
+ smaller? #(< % pivot)
+ xs (rest xs)]
+ (concat
+ (qsort (filter smaller? xs))
+ [pivot]
+ (qsort (remove smaller? xs))))
+ xs))
+
+ (qsort [7 9 -1 3 61 8]) ; (-1 3 7 8 9 61)
+
+= qsort
+== лог
+
+{{{
+<pre>
+qsort [7 9 -1 3 61 8]
+pivot 7
+qsort (-1 3)
+pivot -1
+qsort (3)
+pivot 3
+qsort (9 61 8)
+pivot 9
+qsort (8)
+pivot 8
+qsort (61)
+pivot 61
+</pre>
+}}}
+
+= qsort
+== само първите 2
+
+:code
+ (take 2 (qsort [7 9 -1 3 61 8])) ; (-1 3 7 8 9 61)
+
+{{{
+<pre>
+qsort [7 9 -1 3 61 8]
+pivot 7
+qsort (-1 3)
+pivot -1
+qsort (3)
+pivot 3
+qsort (9 61 8)
+pivot 9
+qsort (8)
+pivot 8
+qsort (61)
+pivot 61
+</pre>
+}}}
+
+= qsort
+== lazy
+
+* за да не смятаме всичко ни трябва итеративен алгоритъм
+* ще представим цялата структура във вида: `(поредица) число (поредица) число … (поредица)`
+
+= qsort
+== lazy имплементация
+
+:annotate
+
+ (defn sort-parts [work]
+ (lazy-seq
+ (loop [[part & parts] work]
+ (if-let [[pivot & xs] (seq part)]
+ (letfn [(smaller? [x] (< x pivot))]
+ (recur (list*
+ (filter smaller? xs)
+ pivot
+ (remove smaller? xs)
+ parts)))
+ (when-let [[x & parts] parts]
+ (cons x (sort-parts parts)))))))
+
+ (defn lazy-qsort [xs]
+ (sort-parts (list xs)))
+
+ (lazy-qsort [7 9 -1 3 61 8]) ; =>
+
+
+= qsort
+== lazy имплементация
+
+:code
+
+ (defn sort-parts [work]
+ (println "lazy" work)
+ (lazy-seq
+ (loop [[part & parts] work]
+ (println "loop" part parts)
+ (if-let [[pivot & xs] (seq part)]
+ (letfn [(smaller? [x] (< x pivot))]
+ (recur (list*
+ (filter smaller? xs)
+ pivot
+ (remove smaller? xs)
+ parts)))
+ (when-let [[x & parts] parts]
+ (cons x (sort-parts parts)))))))
+
+ (defn lazy-qsort [xs]
+ (sort-parts (list xs)))
+
+ (lazy-qsort [7 9 -1 3 61 8]) ; [7 9 -1 3 61 8]
+
+
View
4 lectures/index.yml
@@ -18,3 +18,7 @@
title: 04. Опашки, домашни, мързелуване
date: 2013-03-14
slug: 04-lazy-homework
+'5':
+ title: 05. Game of Life и qsort
+ date: 2013-03-19
+ slug: 05-game-of-qsort
Please sign in to comment.
Something went wrong with that request. Please try again.