|
 | ̤²ò·è |
 | ²ò·è |
 | Ää»ß |
 | ºï½üÍ×ÀÁ |
|
2015/3/15(Sun) 11:12:18|NO.67877
¤³¤ó¤Ë¤Á¤Ï¡£¤¤¤Ä¤â¤ªÀ¤ÏäˤʤäƤ¤¤Þ¤¹¡£
HSP¤Ç¤ÏºÆµ¢¤¬¤Á¤ç¤Ã¤ÈÌäÂꤢ¤ë¤È¤¤¤¦¤³¤È¤ò¸«¤«¤±¡¢
¤³¤Î·Ç¼¨ÈĤǤ⥯¥¤¥Ã¥¯¥½¡¼¥È¤Î¥¹¥¯¥ê¥×¥È¤¬¾å¤¬¤Ã¤Æ¤¤¤Þ¤·¤¿¤¬¡¢
http://hsp.tv/play/pforum.php?mode=all&num=67460
¤¶¤Ã¤È¸«¤¿´¶¤¸¤À¤È¡¢Wikipedia¤Ç¸«¤¿¤Î¤è¤ê
Ê£»¨¤À¤Ã¤¿¤Î¤Ç¡¢¤Á¤ç¤Ã¤È¼ÁÌ䤷¤Æ¤ß¤Þ¤·¤¿¡£
//¥¯¥¤¥Ã¥¯¥½¡¼¥È
//Wikipedia C¸À¸ì¼ÂÁõÎã¤è¤ê
#module
#defcfunc med3 int x,int y,int z
//x, y, z ¤ÎÃæ´ÖÃͤòÊÖ¤¹
if x<y {
if y<z :return y :else :if z<x :return x :else :return z
}
else {
if z<y :return y :else :if x<z :return x :else :return z
}
return 0
#deffunc quicksort array a,int left,int right
/* ¥¯¥¤¥Ã¥¯¥½¡¼¥È
* a : ¥½¡¼¥È¤¹¤ëÇÛÎó
* left : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î³«»Ï°ÌÃÖ
* right : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î½ªÎ»°ÌÃÖ
*/
if left < right {
i =left :j =right
tmp =0 :pivot =med3(a(i),a(i+(j-i)/2),a(j)) //(i+j)/2¤Ç¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Æ¤·¤Þ¤¦
repeat
//a[] ¤ò pivot °Ê¾å¤È°Ê²¼¤Î½¸¤Þ¤ê¤Ëʬ³ä¤¹¤ë
repeat
if a(i)>=pivot :break //a[i] >= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
i++
loop
repeat
if pivot>=a(j) :break //a[j] <= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
j--
loop
if i>=j :break
tmp =a(i) :a(i) =a(j) :a(j) =tmp //a[i],a[j] ¤ò¸ò´¹
i++ :j--
loop
quicksort a,left,i-1
quicksort a,j+1,right
}
return
#global
data=5,3,9,8,7,10,2,1,4,6
quicksort data,0,9 //³«»Ï¤Ï0,½ªÎ»¤Ïn-1
¤³¤Î¥¹¥¯¥ê¥×¥È¤Ç¤âÊ¿µ¤¤Çư¤¯¤ó¤Ç¤¹¤±¤É¡¢
¼ÂÍѾåÌäÂê¤Ê¤¤¤ó¤Ç¤·¤ç¤¦¤«¡©
ÌäÂê¤Ê¤±¤ì¤Ð¤³¤Î¥¹¥¯¥ê¥×¥È¤Î¤Û¤¦¤¬¤¹¤Ã¤¤ê¤·¤Æ¤ë¤·Îɤ¤¤È»×¤Ã¤Æ¤ë¤ó¤Ç¤¹¤¬¡¢
²¿¤«ÌäÂ꤬¤¢¤ì¤Ð¶µ¤¨¤Æ¤¯¤À¤µ¤¤¡£

| |
|
2015/3/15(Sun) 14:23:52|NO.67882
10¤ÎÍ×ÁǤò10000²ó¥½¡¼¥È
you¤Î¥¹¥¯¥ê¥×¥È 414ms
¤â¤¦¤Ò¤È¤Ä¤Î¥¹¥¯¥ê¥×¥È 318ms
ruby 95ms
10000¤ÎÍ×ÁǤò10²ó¥½¡¼¥È
you¤Î¥¹¥¯¥ê¥×¥È 923ms
¤â¤¦¤Ò¤È¤Ä¤Î¥¹¥¯¥ê¥×¥È 850ms
ruby 188ms
|
|
2015/3/15(Sun) 14:34:48|NO.67884
anal¤µ¤ó¤¬´û¤Ë»î¤·¤Æ¤¯¤ì¤Æ¤Þ¤¹¤¬¡¢Ã±¤Ë®ÅÙ¤ÎÌäÂê¤Ç¤¹¡£
ºÆµ¢¤Ç¤âÍ×ÁÇ¿ô¤¬ 2^511 ¤òͤ¨¤Ê¤¤¸Â¤ê°ÂÁ´¤Ê¤Ï¤º(¤¿¤·¤«gosub¤Î¥Í¥¹¥È¤Î¸Â³¦¤¬511¤À¤Ã¤¿µ¤¤¬¤·¤Þ¤¹)¡£Íפ¹¤ë¤Ë¿´ÇÛÉÔÍס£
¤¿¤À¤·¡¢¤´Â¸¤¸¤ÎÄÌ¤ê¥æ¡¼¥¶¡¼ÄêµÁÌ¿Îá¤ÎÀµÂΤϥµ¥Ö¥ë¡¼¥Á¥ó¤Ç¤¹¤Î¤Ç¡¢¸Æ¤Ó½Ð¤·¤Ë¤Ï¿¾¯¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬¤¢¤ê¤Þ¤¹¡£
HU3DM¤Ç¤Ï®ÅÙ¤¬ºÇÍ¥Àè¤Ê¤Î¤ÇÈóºÆµ¢¹½Â¤¤òºÎÍѤ·¤Æ¤¤¤Þ¤¹¡£
°Ê²¼¡¢Â®Å٥ƥ¹¥È¤Ç¤¹¡£
< CPU > Intel Celeron 1.20 GHz
< Internal cache > 1st : 32KB, 2nd : 256 KB
< RAM > PC133 SDRAM 512MB
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//¥¯¥¤¥Ã¥¯¥½¡¼¥È
//Wikipedia C¸À¸ì¼ÂÁõÎã¤è¤ê
#module
#defcfunc med3 int x,int y,int z
//x, y, z ¤ÎÃæ´ÖÃͤòÊÖ¤¹
if x<y {
if y<z :return y :else :if z<x :return x :else :return z
}
else {
if z<y :return y :else :if x<z :return x :else :return z
}
return 0
#deffunc quicksort array a,int left,int right
/* ¥¯¥¤¥Ã¥¯¥½¡¼¥È
* a : ¥½¡¼¥È¤¹¤ëÇÛÎó
* left : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î³«»Ï°ÌÃÖ
* right : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î½ªÎ»°ÌÃÖ
*/
if left < right {
i =left :j =right
tmp =0 :pivot =med3(a(i),a(i+(j-i)/2),a(j)) //(i+j)/2¤Ç¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Æ¤·¤Þ¤¦
repeat
//a[] ¤ò pivot °Ê¾å¤È°Ê²¼¤Î½¸¤Þ¤ê¤Ëʬ³ä¤¹¤ë
repeat
if a(i)>=pivot :break //a[i] >= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
i++
loop
repeat
if pivot>=a(j) :break //a[j] <= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
j--
loop
if i>=j :break
tmp =a(i) :a(i) =a(j) :a(j) =tmp //a[i],a[j] ¤ò¸ò´¹
i++ :j--
loop
quicksort a,left,i-1
quicksort a,j+1,right
}
return
#global
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#module N_M_S2_5
;1¼¡¸µÇÛÎó¤Î¥¯¥¤¥Ã¥¯¥½¡¼¥È
;¶è´Ö¤ò»ØÄê¤Ç¤¤ë¡£
;¾¤Î1¼¡¸µÇÛÎó¤ò´¬¤Åº¤¨¤Ë¤·¤Æ¥½¡¼¥È¤¹¤ë¡£
;
;[½ñ¼°]
;
; MS2_Quick3 TGTARRY,FOLLOWER , opt, s,e
;
; TGTARRY : ¥¿¡¼¥²¥Ã¥ÈÇÛÎó
; FOLLOWER : ÉդꤤÇÛÎó
; opt : À°Î󥪥ץ·¥ç¥ó(0,other)=(¾º½ç,¹ß½ç)
; s,e : ³«»Ï,½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹
;
;[È÷¹Í]
;
; Í×ÁÇ¿ô1°Ê²¼¤Î¥Ç¡¼¥¿¤òÅϤ·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
; ¥¨¥é¡¼¥Á¥§¥Ã¥¯¤ò¾Ê¤¤¤Æ¤¤¤ë¡£°ú¿ô¤ÎÉÔÀµ¤ÏÃ×Ì¿½ý¤Ë¤Ê¤ë¡£
#deffunc MS2_Quick3 array TGT, array ATTENDANT, int opt, int s,int e
;[ÄêµÁ]
;
;¡¦¡ÖASTGT (Assigned Section in TGT)¡× : ¥¿¡¼¥²¥Ã¥ÈÇÛÎó¤Î¤¦¤Á¡¢º£²ó¥½¡¼¥ÈÂоݤȤʤäƤ¤¤ëÈϰϡ£
;¡¦¡Öthresholding¡× : °ìÄê¤Î¶è´ÖÆâ¤Ç¥Ô¥Ü¥Ã¥È(¤³¤ÎÃͤòp¤È¤¹¤ë)¤ò·èÄꤷ¡¢p¤òïçÃͤȤ·¤ÆÍ×ÁǤò¶è´ÖÁ°¸å¤Ë¿¶¤êʬ¤±¤ëÁàºî¡£
;¡¦¡ÖPTS (Present Thresholding Section)¡× : thresholdingÁàºî¤ÎÂоݤȤʤäƤ¤¤ë¶è´Ö¡£
;¡¦¡ÖPSI (Present Scan Index)¡× : thresholdingÁàºî¤Ë¤ª¤¤¤Æp°Ê²¼,°Ê¾å¤ÎÃͤòõº÷¤¹¤ë¤¿¤á¤Î¸½ºß¸¡ººÃæ¤ÎÍ×ÁǤΥ¤¥ó¥Ç¥Ã¥¯¥¹¡£º¸¢ª±¦¤Î¸¡ºº¤Ç¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¡ÖRWPSI (Rightward PSI)¡×¡¢±¦¢ªº¸¤Î¤â¤Î¤ò¡ÖLWPSI (Leftward PSI)¡×¤È¸Æ¤Ö¡£
;¡¦¡Ödivision¡× : thresholdingÁàºî´°Î»¸å¡¢PTS¤ò2ʬ³ä¤¹¤ëÁàºî¡£
len_ASTGT = e-s+1 ;ASTGT¤ÎŤµ
StackCnt = 1 ;¥¹¥¿¥Ã¥¯¤µ¤ì¤Æ¤¤¤ë¶è´Ö¿ô(½é´ü²½)
dim STACK,len_ASTGT : STACK = s,e ;¥¹¥¿¥Ã¥¯½é´ü²½¡£Í×ÁÇ(2*i),(2*i+1)¤ËÂèi¶è´Ö¤Î³«»Ï,½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬µÏ¿¤µ¤ì¤ë¡£
if opt { ;¹ß½ç
repeat
;< pop >
sidx_PTS = STACK(2*StackCnt-2) : eidx_PTS = STACK(2*StackCnt-1) ;PTS³«»Ï/½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹
if TGT(sidx_PTS) < TGT(sidx_PTS+1) : p = TGT(sidx_PTS) : else : p = TGT(sidx_PTS+1) ;p¤Ï¶è´Ö¤Îº¸Ã¼2ÃͤΤ¦¤Á¾®¤µ¤¤Êý¤È¤¹¤ë
;< thresholding >
RWPSI = sidx_PTS : LWPSI = eidx_PTS
repeat
;< rightward scan >
repeat
if TGT(RWPSI) <= p : break
RWPSI ++
loop
;< leftward scan >
repeat
if TGT(LWPSI) >= p : break
LWPSI --
loop
if RWPSI < LWPSI { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(LWPSI) : TGT(LWPSI) = tmpnum ;TGT
tmpnum2 = ATTENDANT(RWPSI) : ATTENDANT(RWPSI) = ATTENDANT(LWPSI) : ATTENDANT(LWPSI) = tmpnum2 ;ATTENDANT
RWPSI ++ : LWPSI --
} else : break ;Í×ʬ³ä¡£¤³¤³¤Ç¼¡¤Î¤³¤È¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¡£¡ sidx_PTS¡åLWPSI¡åRWPSI¡åeidx_PSI ¢ RWPSI-LWPSI¡å1
loop
;< division >
;RWPSI¤Îº¸ÎÙ¤ò¶³¦¤È¤·¤ÆPTS¤òʬ³ä¤¹¤ë
StackCnt -- ;¸½PTS¤ÎÅÐÏ¿²ò½ü
;< º¸Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if RWPSI - sidx_PTS >= 3 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = sidx_PTS, RWPSI-1
StackCnt ++
} else { ;º¸Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬0¡Á2¤Î¾ì¹ç
if RWPSI - sidx_PTS = 2 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(sidx_PTS) < TGT(sidx_PTS+1) { ;Í׸ò´¹
sidx_PTSplus = sidx_PTS+1
tmpnum = TGT(sidx_PTS) : TGT(sidx_PTS) = TGT(sidx_PTSplus) : TGT(sidx_PTSplus) = tmpnum
tmpnum2 = ATTENDANT(sidx_PTS) : ATTENDANT(sidx_PTS) = ATTENDANT(sidx_PTSplus) : ATTENDANT(sidx_PTSplus) = tmpnum2
}
}
}
;< ±¦Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if eidx_PTS - RWPSI >= 2 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = RWPSI, eidx_PTS
StackCnt ++
} else { ;±¦Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬1,2¤Î¾ì¹ç
if eidx_PTS - RWPSI = 1 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(RWPSI) < TGT(eidx_PTS) { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(eidx_PTS) : TGT(eidx_PTS) = tmpnum
tmpnum2 = ATTENDANT(RWPSI) : ATTENDANT(RWPSI) = ATTENDANT(eidx_PTS) : ATTENDANT(eidx_PTS) = tmpnum2
}
}
}
;< finish check >
if StackCnt = 0 : break
loop
} else { ;¾º½ç
repeat
;< pop >
sidx_PTS = STACK(2*StackCnt-2) : eidx_PTS = STACK(2*StackCnt-1)
if TGT(sidx_PTS) < TGT(sidx_PTS+1) : p = TGT(sidx_PTS+1) : else : p = TGT(sidx_PTS) ;p¤Ï¶è´Ö¤Îº¸Ã¼2ÃͤΤ¦¤ÁÂ礤¤Êý¤È¤¹¤ë
;< thresholding >
RWPSI = sidx_PTS : LWPSI = eidx_PTS
repeat
;< rightward scan >
repeat
if TGT(RWPSI) >= p : break
RWPSI ++
loop
;< leftward scan >
repeat
if TGT(LWPSI) <= p : break
LWPSI --
loop
if RWPSI < LWPSI { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(LWPSI) : TGT(LWPSI) = tmpnum
tmpnum2 = ATTENDANT(RWPSI) : ATTENDANT(RWPSI) = ATTENDANT(LWPSI) : ATTENDANT(LWPSI) = tmpnum2
RWPSI ++ : LWPSI --
} else : break
loop
;< division >
;RWPSI¤Îº¸ÎÙ¤ò¶³¦¤È¤·¤ÆPTS¤òʬ³ä¤¹¤ë
StackCnt --
;< º¸Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if RWPSI - sidx_PTS >= 3 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = sidx_PTS, RWPSI-1
StackCnt ++
} else { ;º¸Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬0¡Á2¤Î¾ì¹ç
if RWPSI - sidx_PTS = 2 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(sidx_PTS) > TGT(sidx_PTS+1) { ;Í׸ò´¹
sidx_PTSplus = sidx_PTS+1
tmpnum = TGT(sidx_PTS) : TGT(sidx_PTS) = TGT(sidx_PTSplus) : RWPSI(sidx_PTSplus) = tmpnum
tmpnum2 = ATTENDANT(sidx_PTS) : ATTENDANT(sidx_PTS) = ATTENDANT(sidx_PTSplus) : ATTENDANT(sidx_PTSplus) = tmpnum2
}
}
}
;< ±¦Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if eidx_PTS - RWPSI >= 2 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = RWPSI,eidx_PTS
StackCnt ++
} else { ;±¦Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬1,2¤Î¾ì¹ç
if eidx_PTS - RWPSI = 1 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(RWPSI) > TGT(eidx_PTS) { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(eidx_PTS) : TGT(eidx_PTS) = tmpnum
tmpnum2 = ATTENDANT(RWPSI) : ATTENDANT(RWPSI) = ATTENDANT(eidx_PTS) : ATTENDANT(eidx_PTS) = tmpnum2
}
}
}
;< finish check >
if StackCnt = 0 : break
loop
}
return
#global
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
screen 0,350,480
#define N 2000
mes "¡Á sort test ¡Á\n"+N+" elements"
;< MS2_Quick3 >
mes "< MS2_Quick3 >"
dim TGT, N //¥¿¡¼¥²¥Ã¥È
dim TGTCPY, N //¢¬¤Î¥³¥Ô¡¼
dim FOLLOWER, N //ÉդꤤÇÛÎó
repeat N : TGT(cnt) = rnd(N) : FOLLOWER(cnt) = cnt : loop : memcpy TGTCPY,TGT, 4*N
wait 50
t1 = timeGetTime()
MS2_Quick3 TGT,FOLLOWER, 0, 0,N-1
t2 = timeGetTime()
mes "It took "+str(t2-t1)+" ms."
;< quicksort >
mes "< quicksort >"
dim TGT, N
wait 50
t1 = timeGetTime()
quicksort TGT,0,N-1
t2 = timeGetTime()
mes "It took "+str(t2-t1)+" ms."

| |
|
2015/3/15(Sun) 14:40:10|NO.67885
¼ºÎé¡£»ä¤Î·ë²Ì¤ò½ñ¤Ëº¤ì¤Æ¤¤¤Þ¤·¤¿¡£
MS2_Quick3 : 55ms
quicksort : 72ms
¤Ç¤¹¡£
¸À¤¦¤Þ¤Ç¤â¤Ê¤¯»ä¤Î¥â¥¸¥å¡¼¥ë¤Ç¤Ï¾¤ÎÇÛÎó¤ò´¬¤Åº¤¨¤Ë¤·¤Æ¤¤¤Þ¤¹¤¬¡¢¤½¤ì¤Ç¤â¤Ê¤ªÂ®ÅÙÌ̤ǺƵ¢·¿¤Ë¾¡¤Ã¤Æ¤¤¤Þ¤¹¡£
|
|
2015/3/15(Sun) 16:56:08|NO.67886
ÂçÊѼºÎ餷¤Þ¤·¤¿¡£Âоݥǡ¼¥¿¤¬Ê¿Åù¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£
¤¢¤ì¤Ç¤ÏÈæ³Ó¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó¤Í¡£
¶áÆüÈè¤ì¤Æ¤¤¤ë¤»¤¤¤«¥ß¥¹¤¬...¡£¤´¤á¤ó¤Ê¤µ¤¤¡£
¾ÇÛÎó¤Î´¬¤Åº¤¨¤â³°¤·¤Æ¡¢ºÆµ¢¤ÈÈóºÆµ¢¤Î°ã¤¤¤Ë¾ÇÅÀ¤ò¹Ê¤Ã¤Æ¥Æ¥¹¥È¤ò¤ä¤êľ¤·¤Þ¤·¤¿¡£
< CPU > Intel Celeron 1.20 GHz
< Internal cache > 1st : 32KB, 2nd : 256 KB
< RAM > PC133 SDRAM 512MB
Í×ÁÇ¿ô 2000 int·¿
nonRecQuicksort : 45 ms
quicksort : 63 ms
( 63/45 = 1.4 )
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//¥¯¥¤¥Ã¥¯¥½¡¼¥È
//Wikipedia C¸À¸ì¼ÂÁõÎã¤è¤ê
#module
#defcfunc med3 int x,int y,int z
//x, y, z ¤ÎÃæ´ÖÃͤòÊÖ¤¹
if x<y {
if y<z :return y :else :if z<x :return x :else :return z
}
else {
if z<y :return y :else :if x<z :return x :else :return z
}
return 0
#deffunc quicksort array a,int left,int right
/* ¥¯¥¤¥Ã¥¯¥½¡¼¥È
* a : ¥½¡¼¥È¤¹¤ëÇÛÎó
* left : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î³«»Ï°ÌÃÖ
* right : ¥½¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Î½ªÎ»°ÌÃÖ
*/
if left < right {
i =left :j =right
tmp =0 :pivot =med3(a(i),a(i+(j-i)/2),a(j)) //(i+j)/2¤Ç¤Ï¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Æ¤·¤Þ¤¦
repeat
//a[] ¤ò pivot °Ê¾å¤È°Ê²¼¤Î½¸¤Þ¤ê¤Ëʬ³ä¤¹¤ë
repeat
if a(i)>=pivot :break //a[i] >= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
i++
loop
repeat
if pivot>=a(j) :break //a[j] <= pivot ¤È¤Ê¤ë°ÌÃÖ¤ò¸¡º÷
j--
loop
if i>=j :break
tmp =a(i) :a(i) =a(j) :a(j) =tmp //a[i],a[j] ¤ò¸ò´¹
i++ :j--
loop
quicksort a,left,i-1
quicksort a,j+1,right
}
return
#global
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#module N_M_S2_5
;1¼¡¸µÇÛÎó¤Î¥¯¥¤¥Ã¥¯¥½¡¼¥È
;¶è´Ö¤ò»ØÄê¤Ç¤¤ë¡£
;
;[½ñ¼°]
;
; nonRecQuicksort TGT , opt, s,e
;
; TGT : ¥¿¡¼¥²¥Ã¥ÈÇÛÎó
; opt : À°Î󥪥ץ·¥ç¥ó(0,other)=(¾º½ç,¹ß½ç)
; s,e : ³«»Ï,½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹
;
;[È÷¹Í]
;
; Í×ÁÇ¿ô1°Ê²¼¤Î¥Ç¡¼¥¿¤òÅϤ·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
; ¥¨¥é¡¼¥Á¥§¥Ã¥¯¤ò¾Ê¤¤¤Æ¤¤¤ë¡£°ú¿ô¤ÎÉÔÀµ¤ÏÃ×Ì¿½ý¤Ë¤Ê¤ë¡£
#deffunc nonRecQuicksort array TGT, int opt, int s,int e
;[ÄêµÁ]
;
;¡¦¡ÖASTGT (Assigned Section in TGT)¡× : ¥¿¡¼¥²¥Ã¥ÈÇÛÎó¤Î¤¦¤Á¡¢º£²ó¥½¡¼¥ÈÂоݤȤʤäƤ¤¤ëÈϰϡ£
;¡¦¡Öthresholding¡× : °ìÄê¤Î¶è´ÖÆâ¤Ç¥Ô¥Ü¥Ã¥È(¤³¤ÎÃͤòp¤È¤¹¤ë)¤ò·èÄꤷ¡¢p¤òïçÃͤȤ·¤ÆÍ×ÁǤò¶è´ÖÁ°¸å¤Ë¿¶¤êʬ¤±¤ëÁàºî¡£
;¡¦¡ÖPTS (Present Thresholding Section)¡× : thresholdingÁàºî¤ÎÂоݤȤʤäƤ¤¤ë¶è´Ö¡£
;¡¦¡ÖPSI (Present Scan Index)¡× : thresholdingÁàºî¤Ë¤ª¤¤¤Æp°Ê²¼,°Ê¾å¤ÎÃͤòõº÷¤¹¤ë¤¿¤á¤Î¸½ºß¸¡ººÃæ¤ÎÍ×ÁǤΥ¤¥ó¥Ç¥Ã¥¯¥¹¡£º¸¢ª±¦¤Î¸¡ºº¤Ç¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¡ÖRWPSI (Rightward PSI)¡×¡¢±¦¢ªº¸¤Î¤â¤Î¤ò¡ÖLWPSI (Leftward PSI)¡×¤È¸Æ¤Ö¡£
;¡¦¡Ödivision¡× : thresholdingÁàºî´°Î»¸å¡¢PTS¤ò2ʬ³ä¤¹¤ëÁàºî¡£
len_ASTGT = e-s+1 ;ASTGT¤ÎŤµ
StackCnt = 1 ;¥¹¥¿¥Ã¥¯¤µ¤ì¤Æ¤¤¤ë¶è´Ö¿ô(½é´ü²½)
dim STACK,len_ASTGT : STACK = s,e ;¥¹¥¿¥Ã¥¯½é´ü²½¡£Í×ÁÇ(2*i),(2*i+1)¤ËÂèi¶è´Ö¤Î³«»Ï,½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬µÏ¿¤µ¤ì¤ë¡£
if opt { ;¹ß½ç
repeat
;< pop >
sidx_PTS = STACK(2*StackCnt-2) : eidx_PTS = STACK(2*StackCnt-1) ;PTS³«»Ï/½ªÎ»¥¤¥ó¥Ç¥Ã¥¯¥¹
if TGT(sidx_PTS) < TGT(sidx_PTS+1) : p = TGT(sidx_PTS) : else : p = TGT(sidx_PTS+1) ;p¤Ï¶è´Ö¤Îº¸Ã¼2ÃͤΤ¦¤Á¾®¤µ¤¤Êý¤È¤¹¤ë
;< thresholding >
RWPSI = sidx_PTS : LWPSI = eidx_PTS
repeat
;< rightward scan >
repeat
if TGT(RWPSI) <= p : break
RWPSI ++
loop
;< leftward scan >
repeat
if TGT(LWPSI) >= p : break
LWPSI --
loop
if RWPSI < LWPSI { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(LWPSI) : TGT(LWPSI) = tmpnum ;TGT
RWPSI ++ : LWPSI --
} else : break ;Í×ʬ³ä¡£¤³¤³¤Ç¼¡¤Î¤³¤È¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¡£¡ sidx_PTS¡åLWPSI¡åRWPSI¡åeidx_PSI ¢ RWPSI-LWPSI¡å1
loop
;< division >
;RWPSI¤Îº¸ÎÙ¤ò¶³¦¤È¤·¤ÆPTS¤òʬ³ä¤¹¤ë
StackCnt -- ;¸½PTS¤ÎÅÐÏ¿²ò½ü
;< º¸Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if RWPSI - sidx_PTS >= 3 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = sidx_PTS, RWPSI-1
StackCnt ++
} else { ;º¸Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬0¡Á2¤Î¾ì¹ç
if RWPSI - sidx_PTS = 2 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(sidx_PTS) < TGT(sidx_PTS+1) { ;Í׸ò´¹
sidx_PTSplus = sidx_PTS+1
tmpnum = TGT(sidx_PTS) : TGT(sidx_PTS) = TGT(sidx_PTSplus) : TGT(sidx_PTSplus) = tmpnum
}
}
}
;< ±¦Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if eidx_PTS - RWPSI >= 2 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = RWPSI, eidx_PTS
StackCnt ++
} else { ;±¦Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬1,2¤Î¾ì¹ç
if eidx_PTS - RWPSI = 1 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(RWPSI) < TGT(eidx_PTS) { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(eidx_PTS) : TGT(eidx_PTS) = tmpnum
}
}
}
;< finish check >
if StackCnt = 0 : break
loop
} else { ;¾º½ç
repeat
;< pop >
sidx_PTS = STACK(2*StackCnt-2) : eidx_PTS = STACK(2*StackCnt-1)
if TGT(sidx_PTS) < TGT(sidx_PTS+1) : p = TGT(sidx_PTS+1) : else : p = TGT(sidx_PTS) ;p¤Ï¶è´Ö¤Îº¸Ã¼2ÃͤΤ¦¤ÁÂ礤¤Êý¤È¤¹¤ë
;< thresholding >
RWPSI = sidx_PTS : LWPSI = eidx_PTS
repeat
;< rightward scan >
repeat
if TGT(RWPSI) >= p : break
RWPSI ++
loop
;< leftward scan >
repeat
if TGT(LWPSI) <= p : break
LWPSI --
loop
if RWPSI < LWPSI { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(LWPSI) : TGT(LWPSI) = tmpnum
RWPSI ++ : LWPSI --
} else : break
loop
;< division >
;RWPSI¤Îº¸ÎÙ¤ò¶³¦¤È¤·¤ÆPTS¤òʬ³ä¤¹¤ë
StackCnt --
;< º¸Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if RWPSI - sidx_PTS >= 3 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = sidx_PTS, RWPSI-1
StackCnt ++
} else { ;º¸Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬0¡Á2¤Î¾ì¹ç
if RWPSI - sidx_PTS = 2 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(sidx_PTS) > TGT(sidx_PTS+1) { ;Í׸ò´¹
sidx_PTSplus = sidx_PTS+1
tmpnum = TGT(sidx_PTS) : TGT(sidx_PTS) = TGT(sidx_PTSplus) : RWPSI(sidx_PTSplus) = tmpnum
}
}
}
;< ±¦Â¦¿·µ¬¶è´Ö¸õÊä¤Î¶ãÌ£ >
if eidx_PTS - RWPSI >= 2 { ;ÅÐÏ¿²ÁÃÍͤê
STACK(2*StackCnt) = RWPSI,eidx_PTS
StackCnt ++
} else { ;±¦Â¦¿·µ¬¶è´Ö¸õÊä¤ÎŤµ¤¬1,2¤Î¾ì¹ç
if eidx_PTS - RWPSI = 1 { ;ÆÃ¤Ë2¤Î¾ì¹ç
//¤³¤³¤Ç¥½¡¼¥È¤·¤Æ¤·¤Þ¤¦
if TGT(RWPSI) > TGT(eidx_PTS) { ;Í׸ò´¹
tmpnum = TGT(RWPSI) : TGT(RWPSI) = TGT(eidx_PTS) : TGT(eidx_PTS) = tmpnum
}
}
}
;< finish check >
if StackCnt = 0 : break
loop
}
return
#global
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
screen 0,350,480
#define N 2000
mes "¡Á sort test ¡Á\n"+N+" elements"
;< nonRecQuicksort >
mes "< nonRecQuicksort >"
dim TGT, N //¥¿¡¼¥²¥Ã¥È
repeat N : TGT(cnt) = rnd(N) : loop
wait 50
t1 = timeGetTime()
nonRecQuicksort TGT, 0, 0,N-1
t2 = timeGetTime()
mes "It took "+str(t2-t1)+" ms."
;< quicksort >
mes "< quicksort >"
dim TGT, N
repeat N : TGT(cnt) = rnd(N) : loop
wait 50
t1 = timeGetTime()
quicksort TGT,0,N-1
t2 = timeGetTime()
mes "It took "+str(t2-t1)+" ms."

| |
|
2015/3/15(Sun) 17:17:13|NO.67887
¤Þ¤¿¥ß¥¹¤Ëµ¤¤Å¤¤¤¿¤Î¤ÇÄɵ¡£¥¿¥¤¥à¤ÏÊѤï¤ê¤Þ¤»¤ó¤Ç¤·¤¿¤¬¡£
¥Æ¥¹¥ÈÍÑ¥³¡¼¥ÉÃæ¤Ë2¤Ä¤¢¤ë¡¢¥¿¡¼¥²¥Ã¥ÈÀ¸À®ÍѤÎ
repeat N : TGT(cnt) = rnd(N) : loop
¤È¤¤¤¦Ê¸¤ÎÁ°¤Ë
randomize 0
¤òÊä¤Ã¤Æ¤¯¤À¤µ¤¤¡£
(¤¦¤ó¡¢º£Æü¤Ï¤â¤¦¤À¤á¤À¤Ê¤¡(¾Ð))
|
|
2015/3/15(Sun) 17:34:32|NO.67888
¤ª¤ª¡ª½èÍý»þ´Ö¤Ëº¹¤¬½Ð¤ë¤ó¤Ç¤¹¤Í¡£
¥Ç¡¼¥¿¤¬Â¿¤¤¤È»þ´Ö¤Îº¹¤¬¸²Ãø¤Ëɽ¤ì¤Æ¤¤Þ¤¹¤â¤ó¤Í¡£
²óÅú¤·¤Æ¤¯¤ì¤¿¤ªÆóÊý¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤·¤¿¡£
|
|
2015/3/16(Mon) 01:57:39|NO.67910
> quicksort a,left,i-1
> quicksort a,j+1,right
¤³¤³¤Î1¹ÔÌܤΠquicksort ¤ÎÃæ¤Ç i, j ¤ÎÃͤ¬ÊѤï¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¡¢
2¹ÔÌܤΰú¿ô¤Î j ¤ÏÁÛÄꤵ¤ì¤Æ¤¤¤ëÃͤˤʤäƤޤ¹¡£
(¼ÂºÝ¤Î¤È¤³¤í j ¤Ï (i-1) ¤è¤ê¾®¤µ¤¤ÃͤËÊѲ½¤¹¤ë¤Î¤Ç¡¢É¬Íװʾå¤ÎÈϰϤò¥½¡¼¥È¤·¤Þ¤¹¡£)
¤³¤ÎÎã¤Ç¤Ï¤¢¤Þ¤êÌäÂê¤Ê¤¤¤Ç¤¹¤¬¡¢°ì±þ¡£
|
|
2015/3/16(Mon) 02:03:37|NO.67911
¥ì¥Î¥¹»á¤Î½ñ¤¹þ¤ß¸«¤Æ»×¤Ã¤¿¤ó¤À¤¬HSP¤ÇºÆµ¢¤Ã¤Æ¤¤¤í¤¤¤í¤È¤á¤ó¤É¤¯¤µ¤¤µ¤¤¬
ÊÑ¿ô¤¬¥¹¥¿¥Ã¥¯¤ËµÍ¤Þ¤ì¤ë¤ï¤±¤¸¤ã¤Ê¤¤¤«¤é¡¢»×¤ï¤Ì½ñ¤´¹¤¨¤¢¤ë¤«¤â¤·¤ì¤ó¤·
FunnyMonkey»á¤Î¤è¤¦¤Ê¥ë¡¼¥×¤Ç¤ä¤Ã¤¿¤Û¤¦¤¬°ÂÁ´À¤ÎÌ̤Ǥ⤤¤¤¤«¤â
|
|
2015/3/16(Mon) 07:35:12|NO.67915
>¥ì¥Î¥¹ ¤µ¤ó
¤½¤¦¤Ç¤¹¤è¤Í¡£
¤Þ¤¡¡¢i,j¤ÎÀä̯¤Ê¥Ð¥é¥ó¥¹¤Ë¤è¤Ã¤ÆÂ»³²¤Ï¤´¤¯¾®¤µ¤¯¤È¤É¤á¤é¤ì¤Æ¤¤¤Þ¤¹¤¬¡£
ºòÆü¤Ï̲¤¹¤®¤Æ¸«Æ¨¤·¤Æ¤¿¤ó¤Ç¤¹¤¬¡¢i,j¤¬¥í¡¼¥«¥ë»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¤Í¡£
¤³¤ì¤Ïͳ¡¹¤·¤»öÂÖ¡£
HSPÉÕ°¥É¥¥å¥á¥ó¥È¤Î¡Ö¥â¥¸¥å¡¼¥ëµ¡Ç½¥¬¥¤¥É¡×¤Ë¤Ï¤³¤¦¤¢¤ê¤Þ¤¹¡£
¡¡¥â¥¸¥å¡¼¥ëÆâ¤ÎÊÑ¿ô¤Ï¡¢´ðËÜŪ¤Ë¤¹¤Ù¤ÆÀÅŪ(static)¤Ë¶¦Í¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤Ä¤Þ¤ê°ìÅÙÀßÄꤵ¤ì¤¿ÊÑ¿ô¤Ï¡¢Â¾¤ÎÃͤ¬ÂåÆþ¤µ¤ì¤Ê¤¤¸Â¤ê¡¢ÆâÍÆ¤ò¼º¤¦ ¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¤³¤Î¤¿¤á¡¢ºÆµ¢¸Æ¤Ó½Ð¤·(¼«Ê¬¼«¿È¤ò¸Æ¤Ó½Ð¤¹¤³¤È) ¤ò¹Ô¤Ê¤¦¾ì¹ç¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¹¡£
¡¡¤½¤ì¤¾¤ì¤ÎÄêµÁÌ¿ÎáÆâ¤Ç¤Ï¡¢localÀë¸À¤Ë¤è¤êÌÀ¼¨Åª¤Ë¥í¡¼¥«¥ë¤ÊÊÑ¿ô¤ò ºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
ºÆµ¢¸Æ¤Ó½Ð¤·¤ò¹Ô¤Ê¤¦¾ì¹ç¤Ë¤Ï¡¢É¬¤ºÆâÉô¤Ç »ÈÍѤ¹¤ëÊÑ¿ô¤ò¥í¡¼¥«¥ë¤Ë¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
(¥í¡¼¥«¥ëÀë¸À¤ò¹Ô¤Ê¤¦¤È¡¢ÊÑ¿ô¤ÎÀ¸À®¤ÈÇË´þ¤Î¤¿¤á¤ËÄ̾ï¤è¤ê¤â ¼Â¹Ô¥³¥¹¥È¤¬¤«¤«¤ë¤³¤È¤âα°Õ¤·¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£)
¤È¤¤¤¦¤³¤È¤Ç¡¢
#deffunc quicksort array a,int left,int right
¤ò¡¢
#deffunc quicksort array a,int left,int right, local i,local j
¤È¤¹¤ë¤³¤È¤Ç°ÂÁ´À¤Ï³ÎÊݤǤ¤ë¤ó¤¸¤ã¤Ê¤¤¤«»×¤¤¤Þ¤¹¡£
ÅöÁ³¡¢ÊÑ¿ô¤ÎÀ¸À®¡¦ÇË´þ¤Î¤ªº×¤ê¤Ë¤Ê¤ë¤Î¤Ç¼Â¹Ô¥³¥¹¥È¤¬¾å¤¬¤ê¤Þ¤¹¤¬¡£
>end ¤µ¤ó
¤¢¡¢²û¤«¤·¤¤...¡£
º£¹¹¤Ê¤ó¤Ç¤¹¤¬¡¢¤¢¤Î¥¹¥¯¥ê¥×¥È¤Çgosub¤Î¥Í¥¹¥È¤¬511¤òͤ¨¤¿¤Î¤Ï¡¢¥Ô¥Ü¥Ã¥È¤Î¼è¤êÊý¤ÈºÆµ¢¤Î»ÅÊý¤¬°¤¤¤«¤é¤Ê¤ó¤À¤È»×¤¦¤ó¤Ç¤¹¤è¤Í¡£
¤¢¤Î¤È¤¼«¿®¤¬¤Ê¤¯¤Æ¤½¤³¤Ë¸ÀµÚ¤Ç¤¤Ê¤«¤Ã¤¿¤Î¤¬²ù¤ä¤Þ¤ì¤Þ¤¹¡£
(¤Ç¤Ê¤¤¤È¡¢No.67884¤Ç¤Î»ä¤Îȯ¸À¤È¤Î´Ö¤ËÌ·½â¤¬À¸¤¸¤ë)
¥Ô¥Ü¥Ã¥È¤òïçÃͤȤ·¤ÆÍ×ÁǤòÁ°¸å¤Ë¿¶¤êʬ¤±¤ëÁàºî¤ò¤¹¤ë¤È¡¢Ä̾ï¤Ï2¤Ä¤Î¶è´Ö¤¬¿·¤¿¤ËȯÀ¸¤·¤Þ¤¹¡£
¤³¤³¤Ç¡¢¡Ö¤è¤ê¿È¶á¤¤Êý¡×¤òÍ¥À褷¤ÆºÆµ¢¤ÇÅϤ¹¤³¤È¤Ë¤è¤ê¡¢Á´Í×ÁÇ¿ô 2^511 ¤Þ¤Ç¤Ê¤é³Î¼Â¤ËÂѤ¨¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£
(2ʬˡ¤Î¤è¤¦¤Ê¥¤¥á¡¼¥¸¤Ç¤¹¤¬¡¢¤³¤Î¾ì¹ç¡¢À¸À®¤µ¤ì¤ë¶è´Ö¤Î°ìÊý¤Ïɬ¤º¸µ¤ÎȾʬ¤è¤ê¤âû¤¯¤Ê¤ê¤Þ¤¹)

| |
|
2015/3/16(Mon) 07:37:22|NO.67916
¸í»úÄûÀµ
¡Ö¤è¤ê¿È¶á¤¤Êý¡× ¢ª ¡Ö¤è¤êû¤¤Êý¡×
|
|
2015/3/16(Mon) 23:02:07|NO.67940
¤ä¤Ã¤Ñ¤êºÆµ¢¤À¤Èưºî¤¬²ø¤·¤¯¤Ê¤ë¤ó¤Ç¤¹¤Í¡£
ºÆµ¢¤Ï¤¢¤Þ¤ê»È¤ï¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£
|
|