ã©ã®ãããªçš®é¡ã®ããŒã¿ããœãŒãããŸããïŒ æ¯èŒãšäº€æã䜿çšããŠãé åå ã®æŽæ°ããŒã¿ããœãŒãããŸãã ã€ãŸã é åã®m [i]ãšm [j]ïŒi <jïŒã®èŠçŽ ãæ¯èŒããjçªç®ãiçªç®ãããå°ãããå Žåããããã亀æããŸãã çµæãšããŠãé åã¯æé ã§ãœãŒããããŸãã
泚 ïŒæ¯èŒããã®ã§ãm [j] / 10 <m [i] / 10ã§ãã ããã¯ãåãããŒãæã€ã¢ã€ãã ãã©ã®ããã«ãœãŒãããããã確èªããããã«è¡ãããŸãã ãã®æ¯èŒã§ã¯ã30 <40ããã ã30 = 31 = 32 ...å®å®ïŒãŸãã¯å®å®ãã䞊ã¹æ¿ãïŒã¯ãåãæ¯èŒããŒãæã€èŠçŽ ã®é åºãå€æŽããŸããïŒãã®äŸã§ã¯ãæ¯èŒããŒã¯/ 10èŠçŽ ã®å€ã®æŽæ°éšåã§ãïŒ
以äžã¯åæïŒæªãœãŒãïŒé åã§ãã
50 | 32 | 40 | 31 | 20 | 30 | 10 |
10 | 20 | 32 | 30 | 31 | 40 | 50 |
ãã®èšäºã§äœ¿çšãããŠãããã¹ãŠã®äžŠã¹æ¿ãã¯ãããã€ãã®èŠçŽ ãæ¯èŒããããããæ£ããé åºã«ãªã£ãŠããªãå Žåã¯å€æŽããŸãã ãããã¯ã©ãéãã®ã§ããïŒ æ¯èŒããèŠçŽ ã®ãã¢ãéžæããæ¹æ³ãç°ãªããŸãã
以äžã¯ãCã®ãœãŒãæé ã®äŸã§ãã ã©ãã§ããæåã®ãã©ã¡ãŒã¿ãŒã¯é åã®ã¢ãã¬ã¹ã2çªç®ã¯é åå ã®èŠçŽ ã®æ°ã§ãã ããã·ãŒãžã£ã®å€åŽã®ã«ãŒãã¯ãã¹ãšåŒã°ããå åŽã®ã«ãŒãã¯åçŽã«ã«ãŒãã§ãã
ç°¡åãªä»åã
ãã¹ã¯é åã®ãã¹ãŠã®èŠçŽ ãå埩åŠçããã«ãŒãå ã§çŸåšã®èŠçŽ ãšåŸç¶ã®ãã¹ãŠã®èŠçŽ ãæ¯èŒããŸããvoid sorto(int *m,int n) // , , ... { int tmp; for (int i=0;i<n-1;++i) { // for (int j=i+1; j<n;++j) { // if (m[j]/10<m[i]/10) { // j- , i- tmp=m[i]; m[i]=m[j]; m[j]=tmp; } } } }
äœæ¥çµæ 10 | 20 | 32 | 31 | 30 | 40 | 50 |
çæ-ããã¯éåžžã«é ãã®ã§ å€ãã®æ¯èŒæäœããããŸãã 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) { // , k=0; // for (int i=1; i<n;++i) { if(m[i]/10<m[i-1]/10) { tmp=m[i-1]; m[i-1]=m[i]; m[i]=tmp; k=i; // } } n=k; // k } }
ææªã®å ŽåïŒå
ã®é
åãéã®é åºã§äžŠã¹æ¿ããããå Žåãåãn * n / 2ã®æ¯èŒãåŸãããŸããæé«ã®å Žåãšè¯ãå Žåã®ã©ã¡ãã§ããïŒæè¯ã®å Žåã¯ãé
åãå®å
šã«ççž®ãããå Žåã§ãããã®åŸãæåã®ãã¹ã§äœãåé
眮ãããŸããããã»ãŒãžã®çµããã«nã«0ïŒk = 0ïŒãå²ãåœãŠããã2åç®ã®ãã¹ã¯ãããŸããã100,000ãã¹ã®ä»£ããã«1ã€ã ãã§ãïŒçŽ æŽãããã§ãããé
åã䞊ã¹æ¿ããããŠããŸã£ãã䞊ã¹ãããªãå Žåã¯ã©ãã§ããããããšãã°ã䞊ã¹æ¿ããããé
åã®æå°èŠçŽ ãšæ倧èŠçŽ ã䞊ã¹æ¿ããŠãåé¡ã®ãããã¢ã¬ã€ïŒ30- 32ã¯åãããŒãæã£ãŠããŸãïŒïŒ 50 | 20 | 32 | 31 | 30 | 40 | 10 |
圌ããããã»ã©å¹²æžããªãããã«ããã«ã¡ããã©ããããã æå©ã«æ¥ãŸã
ã·ã§ãŒã«ãŒãœãŒã
泡ã®éžå¥ã§éãèŠçŽ ãããã«æ²ã¿ã軜ãèŠçŽ ããã£ãããšæµ®ãã®ã¯ãªãã§ããïŒ æ¯èŒãµã€ã¯ã«ã¯é åã®å é ããæ«å°Ÿã«ç§»åããéãèŠçŽ ãããã©ãã°ãããããã§ãã ãããŠãæåŸããæåã«ç§»åãããšãèºãããã«çŸããéãèºããã£ãããšæ²ã¿ãŸãã 1åã®ãã¹ã§æã軜ããã®ãæåŸããæåã«ç§»åããŸãã å¶æ°ãã¹ã§ã®ã·ã§ãŒã«ãŒã®ãœãŒãã¯ãæåããæåŸãŸã§ç§»åããå¥æ°ã»ããã§ã¯ãåé¡ã®é åã¯3ãã¹ã§ãœãŒããããŸãã ã»ãŒãœãŒããããã¢ã¬ã€ã®å Žåãã·ã§ãŒã«ãŒã®ãœãŒãã¯ãããã«ããããã¯ããã«é«éã§ãããã©ã³ãã ã«ãœãŒãããããœãŒã¹ã¢ã¬ã€ã®å Žåãã²ã€ã³ã¯éåžžããã»ã©å€§ãããããŸããããã¢ãã©ã·ã䞊ã¹æ¿ãã
ãŸãã¯æ«ã ç¹°ãè¿ããŸããããªãããã«ããã£ãããããã¢ããããã®ã§ããããïŒ ééäžã«åœŒã¯1ããžã·ã§ã³ã«ç§»åããããã§ãã ãããŠããªã圌ã¯1ããžã·ã§ã³ããåããªãã®ã§ããïŒ é£æ¥ããèŠçŽ ãæ¯èŒããã³åé 眮ãããããã§ãã ããã§ã¯ãé£æ¥ããèŠçŽ ã§ã¯ãªããè·é¢sïŒåãã¹ã§åŸã ã«sãæžããïŒã«ããèŠçŽ ãæ¯èŒããŠã¿ãŸãããã ãã®ã¢ã€ãã¢ãå®è·µã«ç§»ããšãæ«ã§ãœãŒãããããšã«ãªããŸãã void sortc(int *m,int n) { int tmp,k; int s=n; // long long cnt=0; while(n>1) { s/=1.247f; // . 80% , // 20% if (s<1) s=1; // 0 , 1 k=0; // for (int i=0; i+s<n;++i) { // , ( s ) if(m[i]/10>m[i+s]/10) { tmp=m[i]; m[i]=m[i+s]; m[i+s]=tmp; k=i; } ++cnt; } if (s==1) // 1, . n=k+1; } }
ã¢ã€ãã¢ã¯åçŽãªããã§ãã¢ã«ãŽãªãºã ã¯è€éã§ã¯ãããŸããããçµæã¯å°è±¡çã§ãã æ«ã®äžŠã¹æ¿ãã¯ãããã«/ã·ã§ãŒã«ãŒãããã¯ããã«é«éã§ããããšãå€æãããè¿
éãªãqsort䞊ã¹æ¿ããè¿œãè¶ãããšããã§ããŸãã ããããã€ãã¹ããããŸã-ããã¯å®å®ããŠããŸããïŒçŽæçã«æããã§ãïŒã Qsortã¯ã€ãã¯ãœãŒã
é åã®ã¯ã€ãã¯ãœãŒãæ©èœã¯éåžžã«ç°¡åã§ãã // qsort int fcomp(const void *i, const void *j) { return (*(int *)i)/10 - (*(int *)j)/10; } void sortq(int *m,int n) { qsort(m,n,sizeof(int),&fcomp); }
æšæºã®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 |