Sorting algorithms/Heapsort: Difference between revisions
Content added Content deleted
(on behalf of laszlo from autohotkey) |
|||
Line 375: | Line 375: | ||
=={{header|Clojure}}== |
=={{header|Clojure}}== |
||
{{trans|OCaml}} |
{{trans|OCaml}} |
||
<lang lisp> |
<lang lisp> |
||
(defn- swap [a i j] |
(defn- swap [a i j] |
||
Line 413: | Line 411: | ||
[1 2 2 3 4 6 6] |
[1 2 2 3 4 6 6] |
||
</lang> |
</lang> |
||
=={{header|D}}== |
|||
<lang d>import std.stdio, std.algorithm; |
|||
/// In-place HeapSort |
|||
public static void heapSort(Tseq)(Tseq seq) { |
|||
static void siftDown(Tseq seq, size_t start, size_t end) { |
|||
for (size_t root = start; root * 2 + 1 <= end; ) { |
|||
auto child = root * 2 + 1; |
|||
if (child + 1 <= end && seq[child] < seq[child + 1]) |
|||
child++; |
|||
if (seq[root] < seq[child]) { |
|||
swap(seq[root], seq[child]); |
|||
root = child; |
|||
} else |
|||
break; |
|||
} |
|||
} |
|||
if (seq.length > 1) |
|||
for (size_t start = (seq.length - 2) / 2 + 1; start > 0; start--) |
|||
siftDown(seq, start - 1, seq.length - 1); |
|||
for (size_t end = seq.length - 1; end > 0; end--) { |
|||
swap(seq[end], seq[0]); |
|||
siftDown(seq, 0, end - 1); |
|||
} |
|||
} |
|||
void main() { |
|||
auto arr = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]; |
|||
heapSort(arr); |
|||
writeln(arr); |
|||
}</lang> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |