;*****************************************************
; ○数値のソートを行う
; sortint p1,p2,p3
; p1:ソートする数値の入った配列変数
; p2:配列の要素数(0=変数が確保している一次配列全て)
; p3;ソート順(0=昇順,1=降順)
;---------------------------------------------------
#module
#deffunc init_sortint
dim func,32
func.0=$0424448b,$08244c8b,$7f00f983,$5755c301,$f88b5356,$fc88548d,$fc246c8d,$000040e8
func.8=$5f5e5b00,$ff8bc35d,$04728d57,$8b04ef83,$fc428b08,$f8d1f9d1,$04ebc813,$1e890789
func.16=$83045f8b,$cb3b04c7,$468bf67f,$04ee83fc,$f67cc83b,$e472fe3b,$8304ef83,$8b5704c6
func.24=$83c78bfe,$d03b04c0,$028bbe77,$c33b1f8b,$1a89047d,$5f5a0789,$e576e53b,$00e2ff57
ll_getptr func:ll_ret pfunc
return
#deffunc sortint val,int,int
mref var,16
mref num,1
mref flag,2
mref pval,1024
ll_getptr var:ll_ret pvar
if num==0:num=pval.2:pvar=pval.7
if flag{
poke func,$48,$7c
poke func,$52,$7f
poke func,$70,$7e
}else{
poke func,$48,$7f
poke func,$52,$7c
poke func,$70,$7d
}
para=pvar,num
ll_callfunc para,2,pfunc
return
#global
init_sortint
;*****************************************************
;以下使用例
;配列の要素数
#define MAXNUM 100000
;rnd2=rndの拡張版 p2に1073741824まで指定できる
#define rnd2(%1,%2=1073741824) rnd %1,32768:rnd rndtmp,32768:%1=%1<<15|rndtmp\(%2)
randomize
dim data1,MAXNUM
dim data2,MAXNUM
mes "データ作成開始"
;0からMAXNUM-1までの数をランダムに並べる
repeat MAXNUM
rnd2 r,cnt+1
data1.cnt=data1.r
data1.r=cnt
loop
memcpy data2,data1,MAXNUM*4
mes "データ作成終了"
mes "ソート開始"
sortint data1,MAXNUM,0
sortint data2,MAXNUM,1
mes "ソート終了"
mes "検証開始"
i=MAXNUM
repeat MAXNUM
i--
if data1.cnt!=cnt:mes "ソート失敗\n終了":stop
if data2.cnt!=i:mes "ソート失敗\n終了":stop
loop
mes "ソート成功"
mes "終了"
stop
戻る