Sorting algorithms/Heapsort: Difference between revisions
m
syntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 67:
{{trans|Python}}
<
V root = start
L
Line 91:
V arr = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
heapsort(&arr)
print(arr)</
{{out}}
Line 101:
{{trans|PL/I}}
The program uses ASM structured macros and two ASSIST macros (XDECO, XPRNT) to keep the code as short as possible.
<
HEAPS CSECT
USING HEAPS,R13 base register
Line 235:
N DC A((N-A)/L'A) number of items
YREGS
END HEAPS</
{{out}}
<pre>
Line 243:
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program heapSort64.s */
Line 481:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
=={{header|ActionScript}}==
<
for (var start:int = (data.length-2)/2; start >= 0; start--) {
siftDown(data, start, data.length);
Line 511:
}
}
}</
=={{header|Ada}}==
This implementation is a generic heapsort for unconstrained arrays.
<
type Element_Type is private;
type Index_Type is (<>);
type Collection is array(Index_Type range <>) of Element_Type;
with function "<" (Left, right : element_type) return boolean is <>;
procedure Generic_Heapsort(Item : in out Collection);</
<
procedure Swap(Left : in out Element_Type; Right : in out Element_Type) is
Temp : Element_Type := Left;
Line 570:
end loop;
end Generic_Heapsort;</
Demo code:
<
with Ada.Text_Io; use Ada.Text_Io;
Line 590:
end loop;
New_Line;
end Test_Generic_Heapsort;</
=={{header|ALGOL 68}}==
<
PROC swap = (REF []INT array, INT first, INT second) VOID:
(
Line 644:
print(("After: ", a))
)</
{{out}}
<pre>
Line 654:
=={{header|AppleScript}}==
===Binary heap===
<
-- Heap sort algorithm: J.W.J. Williams.
on heapSort(theList, l, r) -- Sort items l thru r of theList.
Line 716:
set aList to {74, 95, 9, 56, 76, 33, 51, 27, 62, 55, 86, 60, 65, 32, 10, 62, 72, 87, 86, 85, 36, 20, 44, 17, 60}
sort(aList, 1, -1) -- Sort items 1 thru -1 of aList.
return aList</
{{output}}
<
===Ternary heap===
<
-- Heap sort algorithm: J.W.J. Williams.
on heapSort(theList, l, r) -- Sort items l thru r of theList.
Line 792:
set aList to {75, 46, 8, 43, 20, 9, 25, 89, 19, 29, 16, 71, 44, 23, 17, 99, 79, 97, 19, 75, 32, 27, 42, 93, 75}
sort(aList, 1, -1) -- Sort items 1 thru -1 of aList.
return aList</
{{output}}
<
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
/* ARM assembly Raspberry PI */
Line 1,090:
iMagicNumber: .int 0xCCCCCCCD
</syntaxhighlight>
=={{header|Arturo}}==
<
root: start
a: new items
Line 1,126:
]
print heapSort [3 1 2 8 5 7 9 4 6]</
{{out}}
Line 1,134:
=={{header|AutoHotkey}}==
<
Local end
end := %a%0
Line 1,167:
heapSort("a")
ListVars
MsgBox</
=={{header|BBC BASIC}}==
<
test() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
PROCheapsort(test())
Line 1,204:
IF a(r%) < a(c%) SWAP a(r%), a(c%) : r% = c% ELSE ENDPROC
ENDWHILE
ENDPROC</
{{out}}
<pre>
Line 1,211:
=={{header|BCPL}}==
<
GET "libhdr.h"
Line 1,252:
}
newline()
}</
=={{header|C}}==
<
int max (int *a, int n, int i, int j, int k) {
Line 1,305:
return 0;
}
</syntaxhighlight>
=={{header|C sharp|C#}}==
<
using System.Collections.Generic;
using System.Text;
Line 1,383:
HeapSort(s, 0, s.Length, StringComparer.CurrentCultureIgnoreCase);
}
}</
=={{header|C++}}==
Uses C++11. Compile with
g++ -std=c++11 heap.cpp
<
#include <iterator>
#include <iostream>
Line 1,403:
copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}</
{{out}}
<pre>
Line 1,412:
Uses C++11. Compile with
g++ -std=c++11
<
#include <iostream>
#include <vector>
Line 1,459:
heap_sort(data);
for(int i : data) cout << i << " ";
}</
{{out}}
<pre>
Line 1,466:
=={{header|Clojure}}==
<
(assoc a i (nth a j) j (nth a i)))
Line 1,493:
([a]
(heap-sort a <)))
</syntaxhighlight>
Example usage:
<
[1 2 2 3 4 6 6]
user> (heapsort [1 2 4 6 2 3 6] >)
[6 6 4 3 2 2 1]
user> (heapsort (list 1 2 4 6 2 3 6))
[1 2 2 3 4 6 6]</
=={{header|CLU}}==
<
% may be any type that can be compared.
heapsort = cluster [T: type] is sort
Line 1,584:
stream$puts(po, "After sorting: ")
print_arr[int](po,arr,5)
end start_up</
{{out}}
<pre>Before sorting: 9 -5 3 3 24 -16 3 -120 250 17
Line 1,591:
=={{header|COBOL}}==
{{works with|GnuCOBOL}}
<
*> This code is dedicated to the public domain
*> This is GNUCOBOL 2.0
Line 1,671:
end-perform
.
end program heapsort.</
{{out}}
<pre>prompt$ cobc -xj heapsort.cob
Line 1,679:
=={{header|CoffeeScript}}==
<
heap_sort = (arr) ->
put_array_in_heap_order(arr)
Line 1,711:
arr = [12, 11, 15, 10, 9, 1, 2, 3, 13, 14, 4, 5, 6, 7, 8]
heap_sort arr
console.log arr</
{{out}}
<pre>
Line 1,719:
=={{header|Common Lisp}}==
<
(make-array length :adjustable t :fill-pointer 0))
Line 1,791:
(let ((h (make-heap (length sequence))))
(map nil #'(lambda (e) (heap-insert h e predicate)) sequence)
(map-into sequence #'(lambda () (heap-delete-min h predicate)))))</
Example usage:
<pre>(heapsort (vector 1 9 2 8 3 7 4 6 5) '<) ; #(1 2 3 4 5 6 7 8 9)
Line 1,797:
=={{header|D}}==
<
void heapSort(T)(T[] data) /*pure nothrow @safe @nogc*/ {
Line 1,807:
items.heapSort;
items.writeln;
}</
A lower level implementation:
<
void heapSort(R)(R seq) pure nothrow @safe @nogc {
Line 1,841:
data.heapSort;
data.writeln;
}</
=={{header|Dart}}==
<
void heapSort(List a) {
int count = a.length;
Line 1,915:
}
</syntaxhighlight>
=={{header|Delphi}}==
See [https://rosettacode.org/wiki/Sorting_algorithms/Heapsort#Pascal Pascal].
=={{header|Draco}}==
<
word root, child;
int temp;
Line 1,985:
write("After sorting: ");
for i from 0 upto 9 do write(a[i]:5) od
corp</
{{out}}
<pre>Before sorting: 9 -5 3 3 24 -16 3 -120 250 17
Line 1,992:
=={{header|E}}==
{{trans|Python}}
<
def cswap(c, a, b) {
def t := c[a]
Line 2,028:
}
}
}</
=={{header|EasyLang}}==
<syntaxhighlight lang="text">subr make_heap
for i = 1 to n - 1
if data[i] > data[(i - 1) / 2]
Line 2,064:
data[] = [ 29 4 72 44 55 26 27 77 92 5 ]
call sort
print data[]</
=={{header|EchoLisp}}==
We use the heap library and the '''heap-pop''' primitive to implement heap-sort.
<
(lib 'heap)
Line 2,083:
→ (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14)
</syntaxhighlight>
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
class
HEAPSORT
Line 2,168:
end
</syntaxhighlight>
Test:
<syntaxhighlight lang="eiffel">
class
APPLICATION
Line 2,205:
end
</syntaxhighlight>
{{out}}
<pre>
Line 2,213:
=={{header|Elixir}}==
<
def heapSort(list) do
len = length(list)
Line 2,249:
end
(for _ <- 1..20, do: :rand.uniform(20)) |> IO.inspect |> Sort.heapSort |> IO.inspect</
{{out}}
Line 2,258:
=={{header|F Sharp|F#}}==
<
let temp = a.[i]
a.[i] <- a.[j]
Line 2,279:
for term = n - 1 downto 1 do
swap a term 0
sift cmp a 0 term</
=={{header|Forth}}==
This program assumes that return addresses simply reside as a single cell on the Return Stack. Most Forth compilers fulfill this requirement.
<
70 , 61 , 63 , 37 , 63 , 25 , 46 , 92 , 38 , 87 ,
Line 2,333:
: .array 10 0 do example i cells + ? loop cr ;
.array example 10 heapsort .array </
<
\ Written in ANS-Forth; tested under VFX.
\ Requires the novice package: http://www.forth.org/novice.html
Line 2,420:
10 test-sort
</syntaxhighlight>
{{out}}
<pre style="height:8ex;overflow:scroll">
Line 2,430:
{{works with|Fortran|90 and later}}
Translation of the pseudocode
<
implicit none
Line 2,494:
end subroutine siftdown
end program Heapsort_Demo</
=={{header|FreeBASIC}}==
<
' compile with: fbc -s console
' for boundary checks on array's compile with: fbc -s console -exx
Line 2,567:
Print : Print "hit any key to end program"
Sleep
End</
{{out}}
<pre>Unsorted
Line 2,578:
Direct translation of the pseudocode. The array object (using Scala's <code>ArraySeq</code> class) has built-in method <code>length</code>, so the <code>count</code> parameter is not needed.
<
heapify( a )
end = a.length() - 1
Line 2,607:
a = array( [7, 2, 6, 1, 9, 5, 0, 3, 8, 4] )
heapSort( a )
println( a )</
{{out}}
Line 2,619:
Since we want to implement a generic algorithm, we accept an argument of type <code>sort.Interface</code>, and thus do not have access to the actual elements of the container we're sorting. We can only swap elements. This causes a problem for us when implementing the <code>Pop</code> method, as we can't actually return an element. The ingenious step is realizing that <code>heap.Pop()</code> must move the value to pop to the "end" of the heap area, because its interface only has access to a "Swap" function, and a "Pop" function that pops from the end. (It does not have the ability to pop a value at the beginning.) This is perfect because we precisely want to move the thing popped to the end and shrink the "heap area" by 1. Our "Pop" function returns nothing since we can't get the value, but don't actually need it. (We only need the swapping that it does for us.)
<
import (
Line 2,656:
heapSort(sort.IntSlice(a))
fmt.Println("after: ", a)
}</
{{out}}
<pre>
Line 2,663:
</pre>
If you want to implement it manually:
<
import (
Line 2,700:
root = child
}
}</
=={{header|Groovy}}==
Loose translation of the pseudocode:
<
def checkSwap = { list, i, j = i+1 -> [(list[i] > list[j])].find{ it }.each { makeSwap(list, i, j) } }
Line 2,728:
}
list
}</
Test:
<
println (heapSort([88,18,31,44,4,0,8,81,14,78,20,76,84,33,73,75,82,5,62,70,12,7,1]))</
{{out}}
<pre>.......................................................................[4, 12, 14, 23, 24, 24, 31, 35, 38, 46, 51, 57, 57, 58, 76, 78, 89, 92, 95, 97, 99]
Line 2,738:
=={{header|Haskell}}==
Using package [http://hackage.haskell.org/package/fgl fgl] from HackageDB
<
Heap(..),insert,findMin,deleteMin)
Line 2,752:
heapsort :: Ord a => [a] -> [a]
heapsort = (map fst) . toList . build . map (\x->(x,x))</
e.g.
<
[[2,13],[5],[6,8,14,9],[6,9],[10,7]]</
=={{header|Haxe}}==
{{trans|D}}
<
@:generic
private static function siftDown<T>(arr: Array<T>, start:Int, end:Int) {
Line 2,818:
Sys.println('Sorted Strings: ' + stringArray);
}
}</
{{out}}
<pre>
Line 2,830:
=={{header|Icon}} and {{header|Unicon}}==
<
demosort(heapsort,[3, 14, 1, 5, 9, 2, 6, 3],"qwerty")
end
Line 2,866:
}
return X
end</
Algorithm notes:
* This is a fairly straight forward implementation of the pseudo-code with 'heapify' coded in-line.
Line 2,886:
{{eff note|J|/:~}}
'''Translation of the pseudocode'''
<
siftDown=: 4 : 0
Line 2,902:
z=. siftDown&.>/ (c,~each i.<.c%2),<y NB. heapify
> ([ siftDown swap~)&.>/ (0,each}.i.c),z
)</
'''Examples'''
<
1 1 2 3 4 5 6 7 8 9
heapSort &. (a.&i.) 'aqwcdhkij'
acdhijkqw</
=={{header|Janet}}==
Line 2,915:
Although Janet is a (functional) Lisp, it has support for [https://janet-lang.org/docs/data_structures/arrays.html mutable arrays] and imperative programming.
<
(defn swap [l a b]
(let [aval (get l a) bval (get l b)]
Line 3,002:
# NOTE: Makes a copy of input array. Output is mutable
(print (heap-sort [7 12 3 9 -1 17 6]))</
{{out}}
<pre>
Line 3,010:
=={{header|Java}}==
Direct translation of the pseudocode.
<
int count = a.length;
Line 3,062:
return;
}
}</
=={{header|Javascript}}==
<syntaxhighlight lang="javascript">
function heapSort(arr) {
heapify(arr)
Line 3,105:
heapSort(arr)
expect(arr).toStrictEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
})</
{{out}}
<pre>
Line 3,116:
Since jq is a purely functional language, the putative benefits of the heapsort algorithm do not accrue here.
<
$a
| .[$i] as $t
Line 3,159:
"Before: \(.)",
"After : \(heapSort)\n"
</syntaxhighlight>
{{out}}
<pre>
Line 3,170:
=={{header|Julia}}==
<
a[i], a[j] = a[j], a[i]
end
Line 3,212:
println("Unsorted: $a")
println("Heap sorted: ", heapsort!(a))
</
Unsorted: [3, 12, 11, 4, 2, 7, 5, 8, 9, 1, 10, 6]
Heap sorted: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Line 3,218:
=={{header|Kotlin}}==
<
fun heapSort(a: IntArray) {
Line 3,265:
println(a.joinToString(", "))
}
}</
{{out}}
Line 3,275:
=={{header|Liberty BASIC}}==
<
data 6, 5, 3, 1, 8, 7, 2, 4
Line 3,352:
next i
print
end sub</
=={{header|Lobster}}==
<
// (end represents the limit of how far down the heap to sift)
var root = start
Line 3,412:
heapSort(inputs)
print ("sorted: " + inputs)
</syntaxhighlight>
{{out}}
<pre>
Line 3,425:
=={{header|LotusScript}}==
<syntaxhighlight lang="lotusscript">
Public Sub heapsort(pavIn As Variant)
Dim liCount As Integer, liEnd As Integer
Line 3,471:
wend
End Sub
</syntaxhighlight>
=={{header|M4}}==
<
define(`randSeed',141592653)
Line 3,529:
show(`a')
heapsort(`a')
show(`a')</
=={{header|Maple}}==
<syntaxhighlight lang="text">swap := proc(arr, a, b)
local temp:
temp := arr[a]:
Line 3,567:
arr := Array([17,3,72,0,36,2,3,8,40,0]);
heapsort(arr);
arr;</
{{Out|Output}}
<pre>[0,0,2,3,3,8,17,36,40,72]</pre>
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<
While[(root*2) <= theEnd,
child = root*2;
Line 3,589:
count--; list = siftDown[list,1,count];
]
]</
{{out}}
<pre>heapSort@{2,3,1,5,7,6}
Line 3,596:
=={{header|MATLAB}} / {{header|Octave}}==
This function definition is an almost exact translation of the pseudo-code into MATLAB, but I have chosen to make the heapify function inline because it is only called once in the pseudo-code. Also, MATLAB uses 1 based array indecies, therefore all of the pseudo-code has been translated to reflect that difference.
<
function list = siftDown(list,root,theEnd)
Line 3,635:
end
end</
Sample Usage:
<
ans =
1 2 3 4 5 6</
=={{header|MAXScript}}==
<
(
local s = count /2
Line 3,686:
)
)</
Output:
<syntaxhighlight lang="maxscript">
a = for i in 1 to 10 collect random 0 9
#(7, 2, 5, 6, 1, 5, 4, 0, 1, 6)
heapSort a
#(0, 1, 1, 2, 4, 5, 5, 6, 6, 7)
</syntaxhighlight>
=={{header|Mercury}}==
Line 3,699:
<
:- module heapsort_task.
Line 3,804:
%%% mode: mercury
%%% prolog-indent-width: 2
%%% end:</
{{out}}
Line 3,813:
=={{header|NetRexx}}==
<
options replace format comments java crossref savelog symbols binary
Line 3,895:
end root
return a</
{{out}}
<pre>
Line 3,918:
=={{header|Nim}}==
<
var root = start
while root * 2 + 1 < ending:
Line 3,940:
var a = @[4, 65, 2, -31, 0, 99, 2, 83, 782]
heapSort a
echo a</
{{out}}
<pre>@[-31, 0, 2, 2, 4, 65, 83, 99, 782]</pre>
Line 3,946:
=={{header|Objeck}}==
{{trans|Java}}
<
class HeapSort {
function : Main(args : String[]) ~ Nil {
Line 3,998:
}
}
}</
=={{header|OCaml}}==
<
let swap i j =
Line 4,023:
swap term 0;
sift 0 term;
done;;</
Usage:
<
heapsort a;
Array.iter (Printf.printf "%d ") a;;
Line 4,034:
heapsort b;
Array.iter print_char b;;
print_newline ();;</
{{out}}
<pre>
Line 4,043:
=={{header|Oz}}==
A faithful translation of the pseudocode, adjusted to the fact that Oz arrays can start with an arbitrary index, not just 0 or 1.
<
proc {HeapSort A}
Low = {Array.low A}
Line 4,099:
in
{HeapSort Arr}
{Show {Array.toRecord unit Arr}}</
=={{header|Pascal}}==
An example, which works on arrays with arbitrary bounds :-)
<
type
Line 4,179:
end;
writeln;
end.</
{{out}}
<pre>
Line 4,189:
=={{header|Perl}}==
<
my @a = (4, 65, 2, -31, 0, 99, 2, 83, 782, 1);
Line 4,229:
return $m;
}
</syntaxhighlight>
=={{header|Phix}}==
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 4,274:
<span style="color: #0000FF;">?</span><span style="color: #000000;">heap_sort</span><span style="color: #0000FF;">({</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"oranges"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"and"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"apples"</span><span style="color: #0000FF;">})</span>
<!--</
{{out}}
<pre>
Line 4,281:
=={{header|Picat}}==
<
_ = random2(),
A = [random(-10,10) : _ in 1..30],
Line 4,324:
T = L[I],
L[I] := L[J],
L[J] := T.</
{{out}}
Line 4,332:
=={{header|PicoLisp}}==
<
(let Cnt (length A)
(for (Start (/ Cnt 2) (gt0 Start) (dec Start))
Line 4,350:
(NIL (> (get A Child) (get A Root)))
(xchg (nth A Root) (nth A Child))
(setq Root Child) ) ) )</
{{out}}
<pre>: (heapSort (make (do 9 (link (rand 1 999)))))
Line 4,356:
=={{header|PL/I}}==
<
/*********************************************************************
* Pseudocode found here:
Line 4,431:
End;
End;</
{{out}}
<pre>
Line 4,489:
=={{header|PL/M}}==
<
/* HEAP SORT AN ARRAY OF 16-BIT INTEGERS */
Line 4,563:
CALL BDOS(0,0);
EOF</
{{out}}
<pre>0 1 2 2 3 4 8 31 65 99 782</pre>
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
function heapsort($a, $count) {
$a = heapify $a $count
Line 4,604:
$array = @(60, 21, 19, 36, 63, 8, 100, 80, 3, 87, 11)
"$(heapsort $array $array.Count)"
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 4,611:
=={{header|PureBasic}}==
<
Declare siftDown(Array a(1), start, ending)
Line 4,646:
EndIf
Wend
EndProcedure</
=={{header|Python}}==
<
''' Heapsort. Note: this function sorts in-place (it mutates the list). '''
Line 4,672:
root = child
else:
break</
Testing:
<pre>>>> ary = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
Line 4,682:
This uses code from [[Priority queue#Quackery]].
<
dup pqsize times
[ frompq rot join swap ]
Line 4,689:
[] 23 times [ 90 random 10 + join ]
say " " dup echo cr
say " --> " hsort echo </
''' Output:'''
Line 4,696:
=={{header|Racket}}==
<
#lang racket
(require (only-in srfi/43 vector-swap!))
Line 4,723:
(sift-down! 0 (- end 1)))
xs)
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku"
for ( 0 ..^ +@list div 2 ).reverse -> $start {
_sift_down $start, @list.end, @list;
Line 4,751:
say 'Input = ' ~ @data;
@data.&heap_sort;
say 'Output = ' ~ @data;</
{{out}}
<pre>
Line 4,764:
Indexing of the array starts with '''1''' (one), but can be programmed to start with zero.
<
parse arg x; call init /*use args or default, define @ array.*/
call show "before sort:" /*#: the number of elements in array*/
Line 4,785:
end /*while*/; @.i= $; return /*define lowest.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do s=1 for #; say ' element' right(s, length(#)) arg(1) @.s; end; return</
{{out|output|text= when using the default (epichoric Greek alphabet) for input:}}
(Shown at three-quarter size.)
Line 4,910:
===version 2===
<
* Translated from PL/I
* 27.07.2013 Walter Pachl
Line 4,981:
Say 'element' format(j,2) txt a.j
End
Return</
Output: see PL/I
=={{header|Ring}}==
<
# Project : Sorting algorithms/Heapsort
Line 5,036:
svect = left(svect, len(svect) - 1)
see svect + nl
</syntaxhighlight>
Output:
<pre>
Line 5,046:
=={{header|Ruby}}==
<
def heapsort
self.dup.heapsort!
Line 5,079:
end
end
end</
Testing:
<pre>irb(main):035:0> ary = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
Line 5,089:
{{trans|Python}}
This program allows the caller to specify an arbitrary function by which an order is determined.
<
let mut v = [4, 6, 8, 1, 0, 3, 2, 2, 9, 5];
heap_sort(&mut v, |x, y| x < y);
Line 5,131:
}
}
}</
Of course, you could also simply use <code>BinaryHeap</code> in the standard library.
<
fn main() {
Line 5,141:
let sorted = BinaryHeap::from(src).into_sorted_vec();
println!("{:?}", sorted);
}</
=={{header|Scala}}==
{{works with|Scala|2.8}}
This code is not written for maximum performance, though, of course, it preserves the O(n log n) characteristic of heap sort.
<
import scala.annotation.tailrec // Ensure functions are tail-recursive
import ord._
Line 5,187:
siftDown(0, i)
}
}</
=={{header|Scheme}}==
{{works with|Scheme|R<math>^5</math>RS}}
<
(define (swap! v i j)
(define temp (vector-ref v i))
Line 5,244:
(define uriah (list->vector '(3 5 7 9 0 8 1 4 2 6)))
(heapsort uriah)
uriah</
{{out}}
<pre>done
Line 5,250:
=={{header|Seed7}}==
<
local
var elemType: help is elemType.value;
Line 5,288:
downheap(arr, 1, n);
until n <= 1;
end func;</
Original source: [http://seed7.sourceforge.net/algorith/sorting.htm#heapSort]
=={{header|SequenceL}}==
<syntaxhighlight lang="sequencel">
import <Utilities/Sequence.sl>;
Line 5,325:
in
setElementAt(setElementAt(list, i, vals.B), j, vals.A);
</syntaxhighlight>
=={{header|Sidef}}==
<
var root = start;
while ((2*root + 1) <= end) {
Line 5,366:
say arr; # prints the unsorted array
heap_sort(arr, arr.len); # sorts the array in-place
say arr; # prints the sorted array</
{{out}}
<pre>[10, 5, 2, 1, 7, 6, 4, 8, 3, 9]
Line 5,375:
Since Standard ML is a functional language, a [http://en.wikipedia.org/wiki/Pairing_heap pairing heap] is used instead of a standard binary heap.
<
functor PairingHeap(type t
val cmp : t * t -> order) =
Line 5,429:
val test_3 = heapsort [6,2,7,5,8,1,3,4] = [1, 2, 3, 4, 5, 6, 7, 8]
end;
</syntaxhighlight>
=={{header|Stata}}==
Line 5,435:
Variant with siftup and siftdown, using Mata.
<
k = i
while (k > 1) {
Line 5,478:
siftdown(a, i-1)
}
}</
=={{header|Swift}}==
<
var count = list.count
Line 5,529:
shiftDown(&list, 0, end)
}
}</
=={{header|Tcl}}==
Based on the algorithm from Wikipedia:
{{works with|Tcl|8.5}}
<
proc heapsort {list {count ""}} {
Line 5,572:
lset a $x [lindex $a $y]
lset a $y $tmp
}</
Demo code:
<
{{out}}
<pre>0 1 2 3 4 5 6 7 8 9</pre>
Line 5,653:
=={{header|True BASIC}}==
{{trans|Liberty BASIC}}
<
!creamos la matriz y la inicializamos
LET lim = 20
Line 5,728:
CALL printArray (lim)
END
</syntaxhighlight>
=={{header|uBasic/4tH}}==
<syntaxhighlight lang="text">PRINT "Heap sort:"
n = FUNC (_InitArray)
PROC _ShowArray (n)
Line 5,804:
PRINT
RETURN</
=={{header|Vala}}==
{{trans|C++}}
<
if (array[i1] == array[i2])
return;
Line 5,860:
stdout.printf("%d ", i);
}
}</
{{out}}
Line 5,869:
=={{header|VBA}}==
{{trans|FreeBASIC}}
<
Dim root As Long : root = start
Dim lb As Long : lb = LBound(list)
Line 5,915:
SiftDown list(), 0, eend
Wend
End Sub</
=={{header|Wren}}==
<
var root = start
while (root*2 + 1 <= end) {
Line 5,961:
System.print("After : %(a)")
System.print()
}</
{{out}}
Line 5,974:
Alternatively, we can just call a library method.
{{libheader|Wren-sort}}
<
var as = [ [4, 65, 2, -31, 0, 99, 2, 83, 782, 1], [7, 5, 2, 6, 1, 4, 2, 6, 3] ]
Line 5,982:
System.print("After : %(a)")
System.print()
}</
{{out}}
Line 5,990:
=={{header|zkl}}==
<
n := a.len();
foreach start in ([(n-2)/2 .. 0,-1])
Line 6,008:
start = child;
}
}</
<
heapSort("this is a test".split("")).println();</
{{out}}
<pre>
|