;*****************************************************
;       ○数値のソートを行う
;       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



戻る