diff --git a/library/init/data/list/default.lean b/library/init/data/list/default.lean index 07e3d69e15..c96488d952 100644 --- a/library/init/data/list/default.lean +++ b/library/init/data/list/default.lean @@ -4,4 +4,4 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura -/ prelude -import init.data.list.basic init.data.list.instances init.data.list.lemmas +import init.data.list.basic init.data.list.instances init.data.list.lemmas init.data.list.qsort diff --git a/library/init/data/list/qsort.lean b/library/init/data/list/qsort.lean new file mode 100644 index 0000000000..7e434fd7a9 --- /dev/null +++ b/library/init/data/list/qsort.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2017 Microsoft Corporation. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Author: Leonardo de Moura +-/ +prelude +import init.data.list.basic + +namespace list + +/- TODO(Leo): remove meta as soon as equation compiler has support for well founded recursion. + + This is based on the minimalist Haskell "quicksort". + + Remark: this is *not* really quicksort since it doesn't partition the elements in-place -/ +meta def qsort {α} (lt : α → α → bool) : list α → list α +| [] := [] +| (h::t) := + let small := filter (λ x, lt h x = ff) t, + large := filter (λ x, lt h x = tt) t + in qsort small ++ h :: qsort large + +end list