ãã®èšäºã®äž»ãªç®çã¯ãåå¿è
ããã°ã©ããŒã§ãã äžè¬çãªäžŠã¹æ¿ãã«ã€ããŠãããã³ã€ã³ã¿ãŒãããã®èŠåºãã§èšåãããŠããèšäºã®æµ·ã«ã€ããŠããªããã1ã€å¿
èŠãªã®ã§ããïŒ ããšãã°ãããã«é¢ããè¯ãèšäºããããŸãïŒ
ããã«ãœãŒããšãã¹ãŠãã¹ãŠ ã 第äžã«ãããŸãè¯ããã®ã¯ãããŸããã第äºã«ããã®èšäºã§ã¯ããªããäœãã©ã®ããã«ããªãããšãã質åã«çããããšæããŸãããªããœãŒããå¿
èŠãªã®ã§ããïŒ ãŸããããŒã¿ã®æ€çŽ¢ãšè¡šç€ºçšã æªãœãŒãã®ããŒã¿ã䜿çšããã¿ã¹ã¯ã«ã¯ã解決ãéåžžã«å°é£ãªãã®ãšãäžå¯èœãªãã®ããããŸãã äŸïŒåèªãã¢ã«ãã¡ãããé ã«ãœãŒããããŠããã¹ãã«ãã§ãã¯èŸæžã ããã§ãªãå Žåã¯ãæ£ããåèªãèŠã€ããŠãã ããã ãµãã¹ã¯ã©ã€ããŒãã¢ã«ãã¡ãããé ã«ãœãŒããããŠããé»è©±åž³ã 䞊ã¹æ¿ãããªãã·ã§ã³ã§ãããããŸãå¿
èŠã§ã¯ãªãå Žåã§ãã䞊ã¹æ¿ããããããŒã¿ã䜿çšãããšäŸ¿å©ã§ãã
ã©ã®ãããªçš®é¡ã®ããŒã¿ããœãŒãããŸããïŒ æ¯èŒãšäº€æã䜿çšããŠãé
åå
ã®æŽæ°ããŒã¿ããœãŒãããŸãã ã€ãŸã é
åã®m [i]ãšm [j]ïŒi <jïŒã®èŠçŽ ãæ¯èŒããjçªç®ãiçªç®ãããå°ãããå Žåããããã亀æããŸãã çµæãšããŠãé
åã¯æé ã§ãœãŒããããŸãã
泚 ïŒæ¯èŒããã®ã§ãm [j] / 10 <m [i] / 10ã§ãã ããã¯ãåãããŒãæã€ã¢ã€ãã ãã©ã®ããã«ãœãŒãããããã確èªããããã«è¡ãããŸãã ãã®æ¯èŒã§ã¯ã30 <40ããã ã30 = 31 = 32 ...å®å®ïŒãŸãã¯å®å®ãã䞊ã¹æ¿ãïŒã¯ãåãæ¯èŒããŒãæã€èŠçŽ ã®é åºãå€æŽããŸããïŒãã®äŸã§ã¯ãæ¯èŒããŒã¯/ 10èŠçŽ ã®å€ã®æŽæ°éšåã§ãïŒ
以äžã¯åæïŒæªãœãŒãïŒé
åã§ãã
ãœãŒãæžã¿ïŒ
泚ïŒèŠçŽ 32ã31ã30ã®é åºãå€æŽãããŸããã ãœãŒãã¯å®å®ããŠããŸããïŒå®å®ããŠããŸããïŒã
ãã®èšäºã§äœ¿çšãããŠãããã¹ãŠã®äžŠã¹æ¿ãã¯ãããã€ãã®èŠçŽ ãæ¯èŒããããããæ£ããé åºã«ãªã£ãŠããªãå Žåã¯å€æŽããŸãã ãããã¯ã©ãéãã®ã§ããïŒ æ¯èŒããèŠçŽ ã®ãã¢ãéžæããæ¹æ³ãç°ãªããŸãã
以äžã¯ãCã®ãœãŒãæé ã®äŸã§ãã ã©ãã§ããæåã®ãã©ã¡ãŒã¿ãŒã¯é
åã®ã¢ãã¬ã¹ã2çªç®ã¯é
åå
ã®èŠçŽ ã®æ°ã§ãã ããã·ãŒãžã£ã®å€åŽã®ã«ãŒãã¯ãã¹ãšåŒã°ããå
åŽã®ã«ãŒãã¯åçŽã«ã«ãŒãã§ãã
ç°¡åãªä»åã
ãã¹ã¯é
åã®ãã¹ãŠã®èŠçŽ ãå埩åŠçããã«ãŒãå
ã§çŸåšã®èŠçŽ ãšåŸç¶ã®ãã¹ãŠã®èŠçŽ ãæ¯èŒããŸãã
void sorto(int *m,int n)
äœæ¥çµæ
ã·ã³ãã«ãªäžŠã¹æ¿ãã«å ããŠãå®è£
ãç°¡åã§å®å®ããŠããŸãã
çæ-ããã¯éåžžã«é
ãã®ã§ å€ãã®æ¯èŒæäœããããŸãã nåã®èŠçŽ ã¯ããããåŸç¶ã®ãã¹ãŠã®èŠçŽ ãšæ¯èŒããããããæ¯èŒã®æ°ã¯ãn * n / 2ã§ãã n = 100000ã®å Žåãæ¯èŒã¯50åã§ãã 確ãã«ãn = 1000ã®å Žåããå¯äžãã®æ¯èŒã¯50äžã§ãããææ°ã®ã³ã³ãã¥ãŒã¿ãŒã¯1ç§æªæºã§ãããè¡ãããšãã§ãããããå°éã§ãã®ãœãŒããé©ããŠããŸã.1ã€ã®éèŠãªãã€ãã¹ãããå Žå-ããŒã¿ãã»ãšãã©ãœãŒããããŠããå ŽåïŒ10äžã®èŠçŽ ã®ãã¡ã10ã®ã¿ãã¢ãŠããªããã¬ãŒã¹ïŒããã¹ãŠåãããã«ãåäœæéã¯ã»ãšãã©å€ãããŸããããªããªã æ¯èŒæäœãå€ããªããŸããã¢ã«ãŽãªãºã ãæ¹åããŠã
ããã«ãœãŒã
ãããã«ãã§ããããããã«ãã§ããããŸããå
åŽã®ã«ãŒãã¯é
åãäœåºŠãç¹°ãè¿ããçŸåšã®èŠçŽ ãåã®èŠçŽ ãšæ¯èŒããŸãïŒãããã£ãŠãå®è¡ã¯1ããå§ãŸããŸãïŒãçŸåšã®èŠçŽ ãå°ããå Žåã¯ãåã®èŠçŽ ãšåé
眮ããŸãã é åã®å Žæã¯å€æ°kã«æ ŒçŽãããkã®ããã»ãŒãžã®çµããã«ã€ã³ããã¯ã¹ããããããããé
åããœãŒããããŸãã
void sortb(int *m,int n) { int tmp,k; while(n>1) {
ææªã®å ŽåïŒå
ã®é
åãéã®é åºã§äžŠã¹æ¿ããããå Žåãåãn * n / 2ã®æ¯èŒãåŸãããŸããæé«ã®å Žåãšè¯ãå Žåã®ã©ã¡ãã§ããïŒæè¯ã®å Žåã¯ãé
åãå®å
šã«ççž®ãããå Žåã§ãããã®åŸãæåã®ãã¹ã§äœãåé
眮ãããŸããããã»ãŒãžã®çµããã«nã«0ïŒk = 0ïŒãå²ãåœãŠããã2åç®ã®ãã¹ã¯ãããŸããã100,000ãã¹ã®ä»£ããã«1ã€ã ãã§ãïŒçŽ æŽãããã§ãããé
åã䞊ã¹æ¿ããããŠããŸã£ãã䞊ã¹ãããªãå Žåã¯ã©ãã§ããããããšãã°ã䞊ã¹æ¿ããããé
åã®æå°èŠçŽ ãšæ倧èŠçŽ ã䞊ã¹æ¿ããŠãåé¡ã®ãããã¢ã¬ã€ïŒ30- 32ã¯åãããŒãæã£ãŠããŸãïŒïŒ
1ãã¹ã®æåã®ã¹ãããã§ã¯ãã20ããã50ããšæ¯èŒããã亀æãè¡ãããŸãã 次ã®ã¹ãããã§ã¯ãã32ããã50ããšåã³æ¯èŒãããŸãïŒçŸåšã¯ã20ãã®äœçœ®ãå ããŠããŸãããã®çµæãæåã®ãã¹ã®çµããã«ã50ããçµããã«çœ®ãæãããæ®ãã¯ãã¹ãŠ1ããžã·ã§ã³ãé
åã®å
é ã«ç§»åããŸããæåã®äœçœ®ãäžã«ãããäžã®äœçœ®ãäžã«ãããšæ³åãããšãééã®çµæãšããŠæãéããã®ãäžã«ãªããæã軜ããã®ã«ãªããŸããããèšäºã§ã¯ãéãèŠçŽ ã¯ãéãŠãµã®ããšåŒã°ãã軜ãèŠçŽ ã¯ãã«ã¡ããšåŒã°ããŸãã ãªãŒãããŠãµã®ãã¯ãããéèŠãªãŠãµã®ïŒããã³ã«ä¹ã£ãŠèµ°ãïŒã«åºäŒããããã®å Žæã«çããŸã§ãæåŸãŸã§ïŒãŸãã¯drãïŒèµ°ããŸãã ãããªãã¯ããªãã®å Žæã«å°éããããã«nãã¹ãå¿
èŠãšããŸããæãéãïŒããã¬ãããïŒã¯1åã®ãã¹ã§çŽ æ©ãownããæã軜ãïŒãããã«ãïŒã¯ãã£ãããšãããã¢ããããŸããéè·¯ã æ軜éãé
åã®æåŸã«ããå Žåãé
åå
ã®èŠçŽ ãšåãæ°ã®ãã¹ãå¿
èŠã§ãã
圌ããããã»ã©å¹²æžããªãããã«ããã«ã¡ããã©ããããã æå©ã«æ¥ãŸã
ã·ã§ãŒã«ãŒãœãŒã
泡ã®éžå¥ã§éãèŠçŽ ãããã«æ²ã¿ã軜ãèŠçŽ ããã£ãããšæµ®ãã®ã¯ãªãã§ããïŒ æ¯èŒãµã€ã¯ã«ã¯é
åã®å
é ããæ«å°Ÿã«ç§»åããéãèŠçŽ ãããã©ãã°ãããããã§ãã ãããŠãæåŸããæåã«ç§»åãããšãèºãããã«çŸããéãèºããã£ãããšæ²ã¿ãŸãã 1åã®ãã¹ã§æã軜ããã®ãæåŸããæåã«ç§»åããŸãã å¶æ°ãã¹ã§ã®ã·ã§ãŒã«ãŒã®ãœãŒãã¯ãæåããæåŸãŸã§ç§»åããå¥æ°ã»ããã§ã¯ãåé¡ã®é
åã¯3ãã¹ã§ãœãŒããããŸãã ã»ãŒãœãŒããããã¢ã¬ã€ã®å Žåãã·ã§ãŒã«ãŒã®ãœãŒãã¯ãããã«ããããã¯ããã«é«éã§ãããã©ã³ãã ã«ãœãŒãããããœãŒã¹ã¢ã¬ã€ã®å Žåãã²ã€ã³ã¯éåžžããã»ã©å€§ãããããŸããã
ãã¢ãã©ã·ã䞊ã¹æ¿ãã
ãŸãã¯æ«ã ç¹°ãè¿ããŸã
ãããªãããã«ããã£ãããããã¢ããããã®ã§ããããïŒ ééäžã«åœŒã¯1ããžã·ã§ã³ã«ç§»åããããã§ãã ãããŠããªã圌ã¯1ããžã·ã§ã³ããåããªãã®ã§ããïŒ é£æ¥ããèŠçŽ ãæ¯èŒããã³åé
眮ãããããã§ãã ããã§ã¯ãé£æ¥ããèŠçŽ ã§ã¯ãªããè·é¢sïŒåãã¹ã§åŸã
ã«sãæžããïŒã«ããèŠçŽ ãæ¯èŒããŠã¿ãŸãããã ãã®ã¢ã€ãã¢ãå®è·µã«ç§»ããšãæ«ã§ãœãŒãããããšã«ãªããŸãã
void sortc(int *m,int n) { int tmp,k; int s=n;
ã¢ã€ãã¢ã¯åçŽãªããã§ãã¢ã«ãŽãªãºã ã¯è€éã§ã¯ãããŸããããçµæã¯å°è±¡çã§ãã æ«ã®äžŠã¹æ¿ãã¯ãããã«/ã·ã§ãŒã«ãŒãããã¯ããã«é«éã§ããããšãå€æãããè¿
éãªãqsort䞊ã¹æ¿ããè¿œãè¶ãããšããã§ããŸãã ããããã€ãã¹ããããŸã-ããã¯å®å®ããŠããŸããïŒçŽæçã«æããã§ãïŒã
Qsortã¯ã€ãã¯ãœãŒã
é
åã®ã¯ã€ãã¯ãœãŒãæ©èœã¯éåžžã«ç°¡åã§ãã
æšæºã®qsortã¯ã€ãã¯ãœãŒãã䜿çšãããããåçŽã§ãã äžããããã¢ã«ãŽãªãºã ãããäžåºŠèŠãŠã¿ãŸãããã å
šäœã§ãèŠçŽ ã®ãã¢m [i]ãšm [j]ãéžæãããæ¯èŒãããŸãã ããããm [i]ãšã¯äœã§ããïŒ ããã¯ãæŽæ°mã®é
åã®içªç®ã®èŠçŽ ããŸãã¯ãã¢ãã¬ã¹Ai = m + i * <sizeofïŒintïŒ>ã«ããèŠçŽ ãã§ãã ãããã£ãŠãjçªç®ã®èŠçŽ ã¯ã¢ãã¬ã¹Aj = m + j * <sizeofïŒintïŒ>ã«ãããŸãã ãã®ãããã¢ãã¬ã¹AiãšAjã®èŠçŽ ãæ¯èŒããAj <Aiã®å Žåã¯ããããåé
眮ããŸãïŒé©çšããæ¯èŒæŒç®ã®æå³ã§ã¯ãããããå°ãªãïŒã ãããã£ãŠãqsorté¢æ°ã¯ãé
åïŒæåã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããïŒããèŠçŽ ãéžæãæ¯èŒãããã³åé
眮ããäžçš®ã®äžŠã¹æ¿ãããã»ããµã§ãã åœç¶ãé
åå
ã®èŠçŽ ã®æ°ãç¥ãå¿
èŠãããã2çªç®ã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæž¡ãããŸãã qsortã¯içªç®ã®èŠçŽ ã®äœçœ®ãã©ã®ããã«æ±ºå®ããŸããïŒ éåžžã«ç°¡å-i * <ãã€ãåäœã®èŠçŽ ãµã€ãº>ãé
åã¢ãã¬ã¹ã«è¿œå ããŸãã ãã®<size in bytes>ã¯ã3çªç®ã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæž¡ãããŸãã ããããŸããããqsortã¯ã©ã®ããã«èŠçŽ ãæ¯èŒããŸããïŒ åœŒå¥³ã¯èªåèªèº«ãæ¯èŒããã®ã§ã¯ãªããã¢ãã¬ã¹ã4ã€ã®ãã©ã¡ãŒã¿ãŒã§æž¡ãããæ¯èŒé¢æ°fcompã䜿çšããŸãã qsortãå
éšã¢ã«ãŽãªãºã ã§iããã³jçªç®ã®èŠçŽ ãæ¯èŒããå¿
èŠããããšå€æãããšãã¢ãã¬ã¹ã1ããã³2ãã©ã¡ãŒã¿ãŒãšããŠfcompé¢æ°ã«æž¡ããfcompé¢æ°ã¯æ¯èŒçµæãè¿ããŸã<0ã= 0ã> 0 2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯çããããã以äžã§ãã qsortãi <jã§ãããfcompïŒïŒm [i]ãïŒm [j]ïŒ> 0ã§ããå Žåã圌女ã¯åçŽã«é
åå
ã®èŠçŽ ã亀æããŸãïŒèŠçŽ ã®ãµã€ãºã¯ç¥ã£ãŠããŸãããå
容ã¯éèŠã§ã¯ãããŸããïŒã
ãœãŒãæé10,0001ã¢ã€ãã
Intel i5ããã»ããµïŒ3.3 GHzïŒãæèŒããã³ã³ãã¥ãŒã¿ãŒã§100001èŠçŽ ãå«ãé
åã®äžŠã¹æ¿ãæéã枬å®ããŠã¿ãŸããããæéã¯ç§åäœã§ç€ºãããåæ°ã¯ãã¹ã®æ°ã瀺ããŸãïŒã¯ã€ãã¯äžŠã¹æ¿ãã®å Žåã¯äžæã§ãïŒãé åºä»ãããããæåãšæåŸã®èŠçŽ ã®ã¿ãåé
眮ãããïŒçµ¶å¯ŸçãªãªãŒããŒã çæ³çã«ã¯ããã®ããŒã¿ã®ãã°ã©ãŠã³ããã§ãã ããããã©ã³ãã ããŒã¿ã§ã¯ãcombãšqsortã«ãã䞊ã¹æ¿ãã¯ã©ã€ãã«ã«ãã£ã³ã¹ãäžããŸããã åé¡ã®ããé
åã§ã®ããã«ãœãŒãã§ã¯ãåçŽã«é åæäœã®æ°ãæ¡éãã«å°ãªããããã©ã³ãã ã«æ¯ã¹ãŠé床ã2åã«ãªããŸãã
ä»åã | ã·ã³ãã« | ããã« | ã·ã§ãŒã«ãŒ | ãã¢ãã©ã· | é«éïŒqsortïŒ |
---|
å®å®ãã | + | + | + | - | - |
ã©ã³ãã | 23.1 / 100000 | 29.1 / 99585 | 19.8 / 50074 | 0.020 / 49 | 0.055 |
åé¡ã®ãã | 11.5 / 100000 | 12.9 / 100000 | 0.002 / 3 | 0.015 / 48 | 0.035 |
é | 18.3 / 100000 | 21.1 / 100000 | 21.1 / 100001 | 0.026 / 48 | 0.037 |
ãããŠãåç¹ã«æ»ã£ãŠãããã«ãœãŒããšããœãŒãããã»ã¹ãçŽæ¥èŠãŠã¿ãŸãããã æåã®ãã¹ã§éãèŠçŽ ïŒ50ïŒãæåŸãŸã§éã°ããæ¹æ³ãã芧ãã ããã

æ¯èŒãããã¢ã€ãã ã¯ç·ã®ãã¬ãŒã ã§è¡šç€ºãããåé
眮ãããã¢ã€ãã ã¯èµ€ã®ãã¬ãŒã ã§è¡šç€ºãããŸã
å
¬éåŸã®è¿œå
ç§ã¯qsortãæªããšãé
ããšã¯æããªã-ããã¯ååã«éããæ©èœçã§ãããå¯èœã§ããã°äœ¿çšãã¹ãã§ããã ã¯ãã圌女ã¯æ¯èŒé¢æ°ãåŒã³åºãã®ã«æéãè²»ãããªããã°ãªããããã€ã³ãã¬ãŒã¹ããæ¯èŒãããæ«ãã«éãè²ããŸããã
ãã®é
ãã¯éèŠã§ã¯ãããŸã
ã ïŒqsortããã®ããã«ã®é
ããšæ¯èŒããŠãã ãããããã¯é
åã®æé·ãšãšãã«å¢å ããŸãïŒã ããã§ãæ°å€ã§ã¯ãªããç¹å®ã®ãã£ãŒã«ãã®ããçš®ã®è€éãªæ§é ãæ¯èŒãããã®æ§é ã1000ãã€ãã§æ§æããå¿
èŠããããŸãã é
åã«10äžåã®èŠçŽ ãé
眮ãïŒ100mbã¯äœãïŒãqsortãåŒã³åºããŸãã fcompé¢æ°ïŒæ¯èŒé¢æ°ïŒã¯å¿
èŠãªãã£ãŒã«ããæ¯èŒããçµæã¯ãœãŒããããé
åã§ãã åæã«ãqsortèŠçŽ ãåé
眮ããå Žåã1000ãã€ãã®ãã©ã°ã¡ã³ãã3åã³ããŒããå¿
èŠããããŸãã ãããŠä»ããå°ããªããªãã¯ã-ãœãŒã¹èŠçŽ ãžã®10äžãªã³ã¯ã®é
åãäœæãããã®ãªã³ã¯é
åã®å
é ãqsortã«æž¡ããŸãã qsortãªã³ã¯ã亀æããå Žåããªã³ã¯ã¯1000ã§ã¯ãªã4ãã€ãïŒ64ããã8ïŒã§ããããããããã®4/8ãã€ããå€æŽããå¿
èŠããããŸãã ãã¡ããããã©ã¡ãŒã¿ãšããŠèŠçŽ ã®ã¢ãã¬ã¹ã§ã¯ãªãèŠçŽ ã®ã¢ãã¬ã¹ã®ã¢ãã¬ã¹ãåãåããããfcompãå€æŽããå¿
èŠããããŸãïŒãã ããããã¯åçŽãªå€æŽã§ãïŒã ããããä»ã§ã¯ãããã€ãã®ãœãŒãé¢æ°ãäœæã§ããŸãïŒãããããæ§é äœãã£ãŒã«ãã§ãœãŒãããŸãïŒã ãŸããå¿
èŠã«å¿ããŠãè€æ°ã®ãªã³ã¯ã®é
åãäœæã§ããŸãã qsortãæäŸããå€ãã®å¯èœæ§ããããŸãïŒ
ãšããã§ããªããžã§ã¯ãèªäœã®ä»£ããã«ãªããžã§ã¯ãåç
§ã䜿çšãããšãqsortãåŒã³åºããããšãã ãã§ãªãããã¯ã¿ãŒãã»ãããããããªã©ã®ã³ã³ãããŒã䜿çšãããšãã«ã圹ç«ã¡ãŸãã
æ¯èŒãšäº€æã®æ°
次ã®è¡šã¯ãæ¯èŒæäœã®æ°/åãœãŒãã®äº€æã®æ°ã瀺ããŠããŸãã qsortã®å Žåã亀æã®æ°ã¯äžæã§ãããããæ¯èŒã®æ°ã®ã¿ã衚瀺ãããŸãã ã©ã³ãã é
åã®å Žåãqsortã®æ¯èŒã®æ°ã¯æå°éã§ããããšãããããŸãã
ä»åã | ã·ã³ãã« | ããã« | ã·ã§ãŒã«ãŒ | ãã¢ãã©ã· | é«éïŒqsortïŒ |
---|
ã©ã³ãã | 5'000'050'000 / 1'131'715'503 | 4'999'702'086 / 2'507'142'238 | 3'341'739'679 / 2'507'142'238 | 4'489'129 / 714'533 | 1'915'414 |
åé¡ã®ãã | 5'000'050'000 / 199'999 | 5'000'050'000 / 199'999 | 299'997 / 199'999 | 4'395'305 / 91'829 | 1'588'741 |
é | 5'000'050'000 / 5'000'050'000 | 5'000'050'000 / 5'000'050'000 | 5'000'050'000 / 5'000'050'000 | 4'395'305 / 233'210 | 1'588'741 |