¾Ë°í¸®Áò : Merged Sort
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

ÇÕº´Á¤·Ä (Merged Sort)

merged sort ȤÀº ÇÕº´Á¤·Ä·Î ºÒ¸®¿ì´Â ÀÌ Á¤·Ä¾Ë°í¸®ÁòÀº O(nlogn)ÀÇ ½Ã°£º¹Àâµµ¸¦ º¸¿©ÁÖ´Â Á¤·Ä ¾Ë°í¸®ÁòÀÌ´Ù. ±âº»ÀûÀ¸·Î ÇÕº´Á¤·ÄÀº Á¤·ÄÀÌµÈ ¾çÂÊÀÇ ¿ø¼ÒµéÀ» ÇÕº´ÇÏ´Â ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. À̸¦ À§Çؼ­ ºÐÇÒ Á¤º¹ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù.

¾Æ·¡ÀÇ visual sort ¾ÖÇø´À» ÀÌ¿ëÇϸé ÇÕº´Á¤·Ä ¾Ë°í¸®ÁòÀÇ ¿ø¸®¸¦ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¾Æ·¡ÀÇ ¾ÖÇø´À» º¸·Á¸é JRE°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.



ÇÕº´Á¤·ÄÀº ´ÙÀ½ÀÇ ¾ÆÀ̵ð¾î¸¦ ÀÌ¿ëÇØ¼­ ½ÇÇà½Ã°£À» ÁÙÀ̰í ÀÖ´Ù.
  1. Ä¿´Ù¶õ ÇϳªÀÇ ¸ñ·ÏÀ» °¡Áø Á¤·Äº¸´Ù, ÀÛÀº ¸ñ·ÏÀ» °¡Áø Á¤·ÄÀÌ ´õ ºü¸£´Ù.
  2. ÀÌ¹Ì Á¤·ÄµÈ µÎ°³ÀÇ ¸ñ·ÏÀ» Á¤·ÄÇÏ´Â µ¥¿¡´Â ¸Å¿ì ÀÛÀº ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù. ¿Ö³ÄÇÏ¸é µÎ°³ÀÇ ¸ñ·ÏÀÌ ÀÌ¹Ì Á¤·ÄµÇ¾î ÀÖ´Ù¸é, ¸ñ·ÏÀ» °è¼Ó Áõ°¡½ÃŰ¸é¼­, ´Ù¸¥ ¹öÆÛ¿¡ ³Ö¾îÁֱ⸸ ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù.

¸¸¾à µÎ°³ÀÇ ÀÌ¹Ì Á¤·ÄµÈ ¹è¿­ÀÌ ÁÖ¾îÁ³´Ù¸é, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÇÕº´Á¤·ÄÀ» ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¾Æ·¡´Â C++ ±¸ÇöÀÌ´Ù. °¢°¢ÀÇ ºÐÇÒµÈ ¿ø¼Ò¿¡ ´ëÇØ¼­ ¾Æ·¡ÀÇ Äڵ带 Àû¿ëÇÏ¸é µÉ °ÍÀÌ´Ù. µ¹¾Æ°¡´Âµ¥ Å« ¹®Á¦´Â ¾ø´Â ÄÚµåÀÌÁö¸¸, ÃÖÀûÈ­ µÇÁö ¾Ê¾Ò´Ù. ±¸Çö¿ø¸®¸¦ ÀÌÇØÇϴµ¥ ÁßÁ¡À» µÎ¾ú´Ù.
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <vector> 
 
using namespace std; 
 
// Merged Sort¿¡ »ç¿ëµÉ µ¥ÀÌÅÍ °´Ã¼  
class Data 
{ 
        public: 
            int currentIdx; 
            int *data; 
            int size; 
 
            Data(int *indata, int insize = 0) 
            { 
                data = indata; 
                size = insize; 
                currentIdx = 0; 
            } 
 
            void Input(int a) 
            { 
                data[currentIdx] = a; 
                currentIdx++; 
            } 
 
            int Size() 
            { 
                if (size == 0) 
                    return currentIdx; 
                return size;  
            } 
}; 
 
// Merged Sort Ŭ·¡½º 
class MergedSort 
{ 
    private : 
        int BUFSIZE; 
        int *buff; 
 
        Data *InputData;  
 
        int *buffIdx; 
        int flag; 
        int flagidx; 
        int inputsize; 
        Data *inputData; 
        Data *outputData; 
        vector<Data *> dataVector; 
 
    public : 
        MergedSort()  
        { 
            BUFSIZE = 30; 
            flag = 0; 
            flagidx = 0; 
            inputsize = 0; 
        }; 
 
        void Sort(int *a, int *b, int sizea, int sizeb) 
        { 
            int bufsize; 
            int idx; 
            inputData = new Data(a, sizea); 
            dataVector.push_back(inputData); 
 
            inputData = new Data(b, sizeb); 
            dataVector.push_back(inputData); 
 
            buff = (int *)malloc(sizeof(int)*(sizea + sizeb));  
            memset(buff, 0x00, sizeof(int)*(sizea+sizeb)); 
            outputData = new Data(buff); 
 
            bufsize = BUFSIZE - 1; 
 
            int topdoc = -1; 
            while(true) 
            { 
                idx = dataVector[flag]->currentIdx; 
                if (inputsize > bufsize) 
                { 
                    printf("Input Buffer Excess\n"); 
                    break; 
                } 
                if (idx >= dataVector[flag]->size) 
                { 
                    flagidx++; 
                    flag = flagidx%2; 
                    idx = dataVector[flag]->currentIdx; 
                    int max = dataVector[flag]->size; 
                    while(idx < max) 
                    { 
                        outputData->Input(dataVector[flag]->data[idx]);     
                        idx++; 
                    } 
                    break; 
                } 
                if (dataVector[flag]->data[idx] > topdoc) 
                { 
                    topdoc = dataVector[flag]->data[idx]; 
                    flagidx++; 
                    flag = (flagidx)%2; 
                } 
                else if (dataVector[flag]->data[idx] == topdoc) 
                { 
                    outputData->Input(dataVector[flag]->data[idx]); 
                    dataVector[flag]->currentIdx++; 
                    idx =    dataVector[flag]->currentIdx; 
 
                    topdoc = dataVector[flag]->data[idx]; 
 
                    flagidx++; 
                    flag = flagidx%2; 
                    dataVector[flag]->currentIdx++; 
                } 
                else 
                { 
                    outputData->Input(dataVector[flag]->data[idx]); 
                    dataVector[flag]->currentIdx++; 
                } 
            } 
        } 
        Data *get() 
        { 
            return outputData; 
        } 
}; 
 
int main(int argc, char **argv) 
{ 
    MergedSort *DataSort; 
    Data *rtvData; 
    int a[] = {1, 5, 6, 8, 10, 22, 24, 29, 31, 33, 49, 50, 100, 200, 400, 410, 412, 413}; 
    int b[] = {5, 10, 20, 30, 50, 51}; 
 
    DataSort = new MergedSort(); 
    DataSort->Sort(a, b, sizeof(a)/sizeof(int), sizeof(b)/sizeof(int)); 
    rtvData = DataSort->get(); 
    printf("Size is %d\n", rtvData->Size()); 
    for (int i = 0; i < rtvData->Size(); i++) 
    { 
        printf("%d : %d\n", i, rtvData->data[i]); 
    } 
} 
 

Âü°í ¹®Çå

À̱ÛÀº joinc ºí·Î±×·Î ¹ßÇàµÇ¾ú½À´Ï´Ù. ´ñ±ÛÀº ºí·Î±×¿¡¼­ ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.