diff --git a/contents/bogo_sort/bogo_sort.md b/contents/bogo_sort/bogo_sort.md index d23475740..423600953 100644 --- a/contents/bogo_sort/bogo_sort.md +++ b/contents/bogo_sort/bogo_sort.md @@ -55,6 +55,8 @@ In code, it looks something like this: [import:3-8, lang:"lisp"](code/racket/bogo_sort.rkt) {% sample lang="st" %} [import:2-6, lang:"st"](code/smalltalk/bogosort.st) +{% sample lang="lisp" %} +[import:20-24, lang:"lisp"](code/lisp/bogo-sort.lisp) {% endmethod %} That's it. @@ -109,6 +111,8 @@ We are done here! [import, lang:"lisp"](code/racket/bogo_sort.rkt) {% sample lang="st" %} [import, lang:"st"](code/smalltalk/bogosort.st) +{% sample lang="lisp" %} +[import, lang:"lisp"](code/lisp/bogo-sort.lisp) {% endmethod %} diff --git a/contents/bogo_sort/code/lisp/bogo-sort.lisp b/contents/bogo_sort/code/lisp/bogo-sort.lisp new file mode 100644 index 000000000..dae143bab --- /dev/null +++ b/contents/bogo_sort/code/lisp/bogo-sort.lisp @@ -0,0 +1,26 @@ +;;;; Bogo sort implementation + +(defun sortedp (list) + "Checks if a list is sorted" + (if (< (length list) 2) + t + (if (<= (first list) (second list)) + (sortedp (rest list)) + nil))) + +(defun shuffle (list) + "Returns a shuffled list using the Fisher-Yates method" + (loop for i from (1- (length list)) downto 0 + do + (rotatef + (nth i list) + (nth (random (1+ i)) list)) + finally (return list))) + +(defun bogo-sort (list) + "Sorts a given list (eventually)" + (if (sortedp list) + list + (bogo-sort (shuffle list)))) + +(print (bogo-sort (list 1 3 2 4)))