°­ÁÂ¿Í ÆÁ

CÀÇ qsort¿Í C++ÀÇ sort ÇÔ¼ö ºñ±³ ³¯Â¥:2021-7-25 12:30:24 Á¶È¸¼ö:588
ÀÛ¼ºÀÚ : ¼Ò¿£
Æ÷ÀÎÆ® : 1616
°¡ÀÔÀÏ : 2020-02-02 00:09:14
¹æ¹®È½¼ö : 118
±Û 207°³, ´ñ±Û 65°³
¼Ò°³ : SoEn ¿î¿µÀÚÀÔ´Ï´Ù.
ÀÛ¼º±Û º¸±â
ÂÊÁö º¸³»±â
Á÷Á¢ Á¤·ÄÇÒ ÀÏÀÌ °ÅÀÇ ¾ø¾î ¿äÁòÀº ÀÌ·± ÇÔ¼ö¸¦ Àß ¾²Áö ¾ÊÁö¸¸ ±×·¡µµ Á¤·ÄÀº ¾Ë°í¸®ÁòÀÇ ±âº» ÁßÀÇ ±âº»ÀÌ´Ù. Åë°è ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù Á¤·Ä ·çƾÀ» ¾µ ÀÏÀÌ ÀÖ¾î º° »ý°¢¾øÀÌ qsort¸¦ »ç¿ëÇߴµ¥ ¹Ýº¹ Ƚ¼ö°¡ ¿ö³« ¸¹´Ù º¸´Ï ¼º´ÉÀÌ Á¦´ë·Î ³ª¿ÀÁö ¾Ê¾Ò´Ù. C++ÀÇ sort´Â Á» ´õ ºü¸¥°¡ ½Í¾î Å×½ºÆ®ÇØ ºÃ´Ù.
°£´ÜÇÑ Win32 ¾îÇø®ÄÉÀÌ¼Ç Çϳª ¸¸µé°í ¸¶¿ì½º ¿ÞÂÊ, ¿À¸¥ÂÊ¿¡ °¢°¢ qsort¿Í sort¸¦ È£ÃâÇØ º¸¾Ò´Ù. 1¾ï¹ø ¹Ýº¹ÇÑ ÈÄ °æ°ú ½Ã°£À» Ãâ·ÂÇÏ´Â ¹æ½ÄÀÌ´Ù.

int compare(const void* a, const void* b)
{
    if (*(int *)a == *(int *)b) return 0;
    if (*(int*)a > *(int*)b) return 1;
    return -1;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    int ar[] = { 5, 6, 10, 2, 20, 1, 12, 16, 3, 19, 4, 8, 18, 11, 17, 7, 13, 9, 15, 14};
    int ar2[20];
    DWORD st, ed;
    TCHAR str[128];

    switch (iMessage) {
    case WM_CREATE:
        hWndMain = hWnd;
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_LBUTTONDOWN:
        st = GetTickCount();
        for (int i = 0; i < 100000000; i++) {
            memcpy(ar2, ar, sizeof(ar));
            sort(&ar2[0], &ar2[sizeof(ar) / sizeof(ar[0])]);
        }
        ed = GetTickCount();
        wsprintf(str, TEXT("%d"), ed - st);
        SetWindowText(hWnd, str);
        return 0;
    case WM_RBUTTONDOWN:
        st = GetTickCount();
        for (int i = 0; i < 100000000; i++) {
            memcpy(ar2, ar, sizeof(ar));
            qsort(&ar2[0], sizeof(ar)/sizeof(ar[0]), sizeof(int), compare);
        }
        ed = GetTickCount();
        wsprintf(str, TEXT("%d"), ed - st);
        SetWindowText(hWnd, str);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

°øÁ¤ÇÑ ºñ±³¸¦ À§ÇØ 20°³ÀÇ ¹«ÀÛÀ§ ³­¼ö ¹è¿­À» »ý¼ºÇÏ°í ¸Å¹ø ÀÌ°É º¹»çÇØ¼­ ´Ù½Ã Á¤·ÄÇÑ´Ù. ±âÁ¤·Ä »óÅ¿¡ µû¶ó ¾Ë°í¸®Áò ½ÇÇà ¼Óµµ¿¡ Â÷À̰¡ ÀÖ°í 16°³ ¹Ì¸¸µµ ½ÇÇà ¹æ½ÄÀÌ ´Þ¶óÁö±â ¶§¹®ÀÌ´Ù. 
qsort´Â °³¼ö¸¦ ÁöÁ¤Çϴµ¥ ºñÇØ sort´Â ³¡ À§Ä¡¸¦ ÁöÁ¤ÇÏ°í ³¡Àº ¹üÀ§¿¡¼­ Á¦¿ÜµÊÀ» À¯ÀÇÇØ¾ß ÇÑ´Ù. STLÀº Ç×»ó ³¡Àº Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. 20°³¸¦ 1¾ï¹ø º¹»ç ¹× Á¤·ÄÇÑ ÈÄ °æ°ú ½Ã°£À» ÃøÁ¤Çß´Ù. 

qsort : 47.3ÃÊ
sort : 4.6ÃÊ

°ÅÀÇ 10¹è Á¤µµ Â÷À̰¡ ³­´Ù. memcpy È£ÃâÀÌ ÀÖ¾î ¼ø¼öÇÑ Á¤·Ä ¼Óµµ¸¸Àº ¾Æ´ÏÁö¸¸ ´ëÃæºÁµµ Â÷À̰¡ ¸¹À½À» ¾Ë ¼ö ÀÖ´Ù. ¹è¿­ Å©±â°¡ ¹Ù²î¸é ´Þ¶óÁú ¼öµµ ÀÖ¾î Å©±â¸¦ 5·Î ÁÙÀÎ ÈÄ ´Ù½Ã ÃøÁ¤ÇØ ºÃ´Ù. 

qsort : 5.75ÃÊ
sort : 0.81ÃÊ

´ë·« 7¹è Â÷À̳­´Ù. ¾î·°Å³ª sort°¡ ´õ ºü¸£´Ù. qsort´Â C ÇÔ¼ö°í sort´Â C++ ÇÔ¼öÀε¥ ¿¹»ó°ú ´Þ¸® C ÇÔ¼ö°¡ ´õ ´À¸®´Ù. ±× ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù.

- qsort´Â ºñ±³¸¦ À§ÇØ compare¸¦ È£ÃâÇÏ¿© ÇÔ¼ö È£Ãâ ¿À¹öÇìµå°¡ ÀÖ´Ù. sort´Â less ¶Ç´Â greater ÇÔ¼ö °´Ã¼·Î ºñ±³Çϴµ¥ ÀÌ Äڵ尡 ÀζóÀΠó¸®µÇ¾î ¿À¹öÇì´õ°¡ ¾ø´Ù. 
- qsort´Â ÀÓÀÇÀÇ ´ë»óÀ» Á¤·ÄÇϱâ À§ÇØ ºñ±³ ÇÔ¼ö·Î void * ÁÖ¼Ò¸¦ ³Ñ±ä´Ù. ºñ±³ ÇÔ¼ö´Â ÀÌ°É ´Ù½Ã ´ë»óÀÇ Å¸ÀÔÀ¸·Î ij½ºÆÃÇÑ ÈÄ ºñ±³ÇÏ´Ï ´À¸®´Ù. sort´Â ÅÛÇø´ ±â¹ÝÀ̾ ŸÀÔÀÌ ÀÌ¹Ì Á¤ÇØÁ® ÀÖÀ¸¸ç Á¤¼ö´Â °ª ÀÚü¸¦ ¹Ù·Î ºñ±³ÇÑ´Ù. 

Äü¼ÒÆ®°¡ ºü¸¥ ¾Ë°í¸®ÁòÀÎ °Ç ¸ÂÁö¸¸ ¿ä¼ÒÀÇ ¹è¿­ »óųª Å©±â µî¿¡ ¿µÇâÀ» ¹Þ¾Æ ÃÖ¾ÇÀÇ °æ¿ì´Â È¿À²ÀÌ ½ÉÇÏ°Ô ¶³¾îÁø´Ù. sort´Â »ðÀÔ, Èü, Äü ¼¼ °¡Áö ¾Ë°í¸®ÁòÀ» °³¼ö¿Í »óȲ¿¡ µû¶ó Á¶ÇÕÇØ¼­ Àû¿ëÇÑ introsort ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù. 16°³ ÀÌÇÏ¸é »ðÀÔ Á¤·ÄÀ» ¾²°í ±× ÀÌ»óÀ̸é ÄüÀ̳ª ÈüÀ» ¾²µµ·Ï µÇ¾î ÀÖ¾î ºü¸£´Ù. 

Ȥ½Ã³ª ÇØ¼­ Á÷Á¢ »ðÀÔ Á¤·Ä ¾Ë°í¸®ÁòÀ» ÀζóÀÎÀ¸·Î ±¸ÇöÇØ ºÃ´Âµ¥ sort ÇÔ¼ö¿Í ¼Óµµ°¡ °ÅÀÇ ºñ½ÁÇÏ´Ù. sort´Â °³¼ö°¡ ÀÛÀ¸¸é »ðÀÔ Á¤·ÄÀ» ¾²µµ·Ï µÇ¾î ÀÖ¾î 20°³ Á¤µµ¸é Â÷À̰¡ ¾ø´Â ÆíÀÌ´Ù. qsort´Â ´Ü¼øÇØ º¸¿©µµ ºñ±³ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ºÒÀÌÀÍÀÌ ÀÖ¾î ±×´ÙÁö È¿À²ÀûÀÌÁö´Â ¾Ê´Ù. ¾ÕÀ¸·Î Á¤·ÄÀº sort·Î ½ÇÇàÇϵµ·Ï ÇÏÀÚ. 



°³¹ßÀÚÀÇ Ãµ±¹ SoEn

¸ñ·Ïº¸±â »èÁ¦ ¼öÁ¤ ½Å°í ½ºÅ©·¦


·Î±×ÀÎÇÏ¼Å¾ß ´ñ±ÛÀ» ´Þ ¼ö ÀÖ½À´Ï´Ù.