Bubblesort
Från Unix.se, den fria unixresursen.
Innehåll |
[edit]
Förklaring av algoritmen
Bubbelsortering är som namnet antyder en sorteringsalgoritm (och en mycket ineffektiv sådan). Algoritmen går ut på att man jämför två värden i taget och flyttar om dem så att deras inbördes ordning stämmer. Därefter går man igenom hela listan upprepade gånger, så att elementen liksom "bubblar" upp till sina rätta platser.
[edit]
Implementationer
[edit]
Prolog
bubblesort(O,S) :- append(X,[A,B|Y],O), A > B, append(X,[B,A|Y],N), bubblesort(N,S). bubblesort(L,L).
[edit]
Common Lisp
(defun bubble-sort (list) (loop for swapped = nil doing (loop for pair on list when (and (rest pair) (> (first pair) (second pair))) do (rotatef (first pair) (second pair)) (setf swapped t)) while swapped finally (return list)))
[edit]
O'Caml
let bubble l = let rec foo = function [] -> [] | (x :: []) as l -> l | (x :: y :: l) -> if x > y then x :: bubble (y :: l) else y :: bubble (x :: l) in let rec loop f l = let l2 = f l in if l = l2 then l else loop f l2 in loop foo l ;;
Den här varianten är svansrekursiv, vilket innebär att O'Caml internt kan optimera bort de multipla funktionsanropen som rekursiviteten medför.
[edit]
C++
template<class Iterator> void bubblesort(Iterator begin, Iterator end) { bool changed; do { changed = false; Iterator i = begin(); while(i < end) { Iterator next = i+1; if(*i > *next) { std::swap(*i, *next); changed = true; i = next; } } while(changed); }