Nestharus
o-o
- Reaction score
- 83
QSort optimized for integer comparisons (could put in compare and exchange methods to work with any type, but I personally needed integers so if someone wants to quickly mod this to use compare/exchange, go for it).
JASS:
library QSortI
//static method sort takes integer size, boolean smallestToGreatest returns nothing
//
//Expects
// static integer array v
module QSortI
private static boolean y
private static method is takes integer f, integer t returns nothing
local integer i
local integer j
local integer m
if (t>f) then
set i=f+1
loop
exitwhen i>t
set j=i
loop
exitwhen j<=f or (y and v[j]>v[j-1]) or (not y and v[j]<v[j-1])
set m=v[j]
set v[j]=v[j-1]
set v[j-1]=m
set j=j-1
endloop
set i=i+1
endloop
endif
endmethod
private static method s takes integer f, integer t returns nothing
local integer p
local integer a
local integer i
local integer m
if (t>f) then
if ((f+t)/2>t) then
set p=v[t]
elseif ((f+t)/2>f) then
set p=v[(f+t)/2]
else
set p=v[f]
endif
elseif ((f+t)/2>f) then
set p=v[f]
elseif ((f+t)/2>t) then
set p=v[(f+t)/2]
else
set p=v[t]
endif
set a=t
set i=f
loop
loop
exitwhen p>=v[a]
set a=a-1
endloop
loop
exitwhen p<=v<i>
set i=i+1
endloop
if (i<=a) then
if (i!=a) then
set m=v[a]
set v[a]=v<i>
set v<i>=m
endif
set a=a-1
set i=i+1
endif
exitwhen a<i
endloop
if (IAbsBJ(a-f)>10) then
call s(f,a)
else
call is(f,a)
endif
if (IAbsBJ(t-i)>10) then
call s(i,t)
else
call is(i,t)
endif
endmethod
static method sort takes integer z, boolean l returns nothing
set y=l
call s(0,z-1)
endmethod
endmodule
endlibrary
</i></i></i>
JASS:
struct Tester extends array
private static integer array v
private static integer array v2
implement QSortI
private static method onInit takes nothing returns nothing
local integer i
local integer m=9
local string s
set v[0]=5
set v[1]=3
set v[2]=6
set v[3]=9
set v[4]=4
set v[5]=5
set v[6]=12
set v[7]=13
set v[8]=4
/////////////////////////////////////////////////////
set v2[0]=3
set v2[1]=4
set v2[2]=4
set v2[3]=5
set v2[4]=5
set v2[5]=6
set v2[6]=9
set v2[7]=12
set v2[8]=13
set i=m
set s=""
loop
exitwhen 0==i
set i=i-1
set s=I2S(v2<i>)+","+s
endloop
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,s)
call sort(m,true)
set i=m
set s=""
loop
exitwhen 0==i
set i=i-1
set s=I2S(v<i>)+","+s
endloop
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,s)
endmethod
endstruct
</i></i>