Insertionsort°¡ ÀåÂøµÈ Quicksort(Recursive/Nonrecursive)¿¡¼­ random¿ø¼Ò°¡ 1000°³À϶§ °¡Àå ÁÁÀº ¼º´ÉÀ» °®´Â 'M'°ª ±¸Çϱâ.



- ¾Ë°í¸®Áò °³·Ð -

±èÁøÈ« (964524)





°á°ú:

Recursive Quicksort: M = 15

Nonrecursive Quicksort: M = 26



ÃøÁ¤¹æ¹ý:

°¡Àå ÁÁÀº M°ªÀ» ±¸Çϱâ À§Çؼ­´Â Quicksort(ÀÌÇÏ Qsort)ÀÇ Ã³¸® ¼Óµµ¸¦ Á¤¹ÐÇÏ°Ô °Ë»çÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ QsortÀÇ average case¿¡¼­ÀÇ ÁøÇà ¼Óµµ°¡ ¿ö³« »¡¶ó¼­ 1000°³ÀÇ ¿ø¼Ò¸¸À¸·Î´Â ½Ã½ºÅÛÀÇ 100ºÐÀÇ 1ÃÊ Å¸À̸ӷνᵵ ÃøÁ¤ÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ½Ã°£ÀÌ Á» °É¸®Áö¸¸, 1000°³ÀÇ ¿ø¼Ò¸¦ 2000¹ø QsortÇϵµ·Ï ÇÏ¿© °æ°ú½Ã°£À» 2000À¸·Î ³ª´®À¸·Î½á Qsort¸¦ 1¹ø ½ÇÇàÇÒ¶§ÀÇ ½Ã°£À» ¾Ë¾Æ³»¾ú´Ù. ÇÏÁö¸¸ ¸Å¹ø QsortÇϱâÀü¿¡ 1000°³ÀÇ ¸ðµç ¿ø¼Ò°¡ ´Ù½Ã ³­ºÐÆ÷µÇ¾î ÀÖ¾î¾ß average case°¡ º¸ÀåÀÌ µÇ¹Ç·Î ¸Å¹ø 1000°³ÀÇ ¿ø¼Ò¸¦ À籸¼ºÇÏ°Ô µÇ´Âµ¥, ±×·¸±â ¶§¹®¿¡ 2000À¸·Î ³ª´©¾î ³ª¿À´Â ±× °æ°ú½Ã°£Àº »ç½Ç 1000°³ÀÇ ¿ø¼Ò¸¦ À籸¼º ÇÏ´Â ½Ã°£°ú QsortÇÏ´Â ½Ã°£ÀÌ ÇÕÃÄÁø °ÍÀÌ´Ù. ³­ Qsort¸¸ÀÇ ½ÇÇà½Ã°£À» ¾Ë°í ½Í¾ú±â ¶§¹®¿¡, 1000°³ÀÇ ¿ø¼Ò¸¦ 2000¹ø À籸¼ºÇÏ´Â °úÁ¤À» µû·Î ÃøÁ¤ÇÏ¿© ³ª¿Â ½Ã°£À», Qsort¸¦ 2000¹ø ó¸®ÇÏ°í ³ª¿Â ½Ã°£¿¡¼­ »©°í 2000À¸·Î ³ª´®À¸·Î½á Qsort¸¦ ´Ü Çѹø ½ÇÇàÇ߶§ÀÇ ¼Óµµ¸¦ ¾î´ÀÁ¤µµ Á¤¹ÐÇÏ°Ô ÃøÁ¤ÇÒ ¼ö ÀÖ¾ú´Ù.

ÃøÁ¤½Ã¿¡ »ç¿ëÇÑ Å¸À̸ӷνá systemÀÌ ¸Å¹ø ¾à ÃÊ´ç 18.2¹ø Ä«¿îÆ®¸¦ ÇÏ°í ÀÖ´Â µ¥ÀÌŸ ¿µ¿ªÀ» Á÷Á¢ accessingÇÔÀ¸·Î½á °£ÆíÇÏ°Ô °æ°ú½Ã°£À» ÃøÁ¤ÇÒ ¼ö ÀÖ¾ú´Ù. °æ°ú ½Ã°£À» ÃøÁ¤ÇÏ´Â ¹æ¹ýÀº Qsort¸¦ ½ÃÀÛÇϱâÀü¿¡ ±× µ¥ÀÌŸ ¿µ¿ªÀÇ ¼öÄ¡¸¦ Àаí, Qsort°¡ ³¡³ª°í ³ª¼­ ¹Ù·Î ´Ù½Ã ÀÐÀº ´ÙÀ½¿¡ ±× µÎ °ªÀÇ Â÷À̸¦ 18.2·Î ³ª´©¸é °æ°ú ½Ã°£À» Ãʽð£À¸·Î ¾òÀ» ¼ö ÀÖ´Ù. ÃÊ´ç ºñ·Ï 18.2¹ø Ä«¿îÆ® Çϱ⠶§¹®¿¡ ¾ÆÁÖ Á¤¹ÐÇÏÁø ¾ÊÁö¸¸, ¾ò¾îÁø ±× µÎ °ªÀÇ Â÷À̸¦ 18.2·Î ³ª´©¸é »ó´ëÀûÀÎ ½Ã°£À» ºñ±³Àû Á¤¹ÐÇÏ°Ô ¼Ò¼öÁ¡±îÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

¸ÕÀú °á°ú¸¦ º¸ÀÚ:

ÁÖÀÇ:

¾Æ·¡ °á°ú´Â ½ÇÁ¦ output¿¡¼­ ¸¶Áö¸· ºÎºÐ¿¡ ÇØ´ç. ½ÇÁ¦ outputÀº ´À¸®¸ç ¶ÇÇÑ Ãâ·Â¹°ÀÌ ±æ´Ù.

¶Ç ¾Æ·¡ ÃøÁ¤ °á°ú´Â ÇÊÀÚ PC¿¡¼­ÀÇ °á°úÀ̹ǷΠŸ ±âÁ¾¿¡¼­´Â ´Ù¸¦ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÃÖÀûÀÇ

M°ªÀÌ º¯ÇÏ´Â ÀÏÀº ¾ø´Ù.

* Recursive QsortÀ϶§ MÀ» 2ºÎÅÍ 41±îÁö ÃøÁ¤ÇÔ. ´ÜÀ§´Â ÃÊ.

[2] 0.002335 [3] 0.002170 [4] 0.002033 [5] 0.001978 [6] 0.001923 [7] 0.001896 [8] 0.001841

[9] 0.001841 [10] 0.001813 [11] 0.001813 [12] 0.001786 [13] 0.001786 [14] 0.001786

[15] 0.001786 [16] 0.001786 [17] 0.001786 [18] 0.001786 [19] 0.001813 [20] 0.001813

[21] 0.001813 [22] 0.001841 [23] 0.001841 [24] 0.001841 [25] 0.001868 [26] 0.001896

[27] 0.001896 [28] 0.001896 [29] 0.001923 [30] 0.001923 [31] 0.001951 [32] 0.001978

[33] 0.001978 [34] 0.002005 [35] 0.002033 [36] 0.002033 [37] 0.002060 [38] 0.002060

[39] 0.002088 [40] 0.002115 [41] 0.002143

À§ °á°ú¿¡¼­ QsortÀÇ ¼º´ÉÀÌ °¡Àå ÁÁ¾ÆÁú ¶§°¡ M°ªÀÌ 12ÀÏ ¶§ºÎÅÍ 18±îÁö ÀÌ´Ù. À§ ½ÇÇèÀ» ¸î¹ø¿¡ °ÉÃļ­ ÇØ º» °á°ú, ÀϹÝÀûÀ¸·Î MÀÌ 12ºÎÅÍ 18±îÁö¿¡¼­ »ó´ëÀûÀ¸·Î ÃÖÀûÀÇ ¼º´ÉÀ» º¸¿© ÁÖ¾ú´Ù. ±×·¯¹Ç·Î ÃÖÀûÀÇ M°ªÀº 12°ú 18»çÀÌÀÇ Áß°£ÀÎ 15¶ó°í ÇÒ ¼ö ÀÖ´Ù. (M°ªÀ» 2ºÎÅÍ 10´ÜÀ§·Î Á¡ÇÁÇØ °Ë»çÇغ» °á°ú MÀÌ 18ÀÌÈÄ·Î °è¼ÓÇؼ­ ´À·ÁÁö´Â°ÍÀ» ¾Ë ¼ö ÀÖ¾úÀ¸¹Ç·Î M°ªÀ» 41±îÁö¸¸ ÃøÁ¤ÇÏ¿´´Ù.)

* Nonrecursive QsortÀ϶§ MÀ» 2ºÎÅÍ 41±îÁö ÃøÁ¤ÇÔ. ´ÜÀ§´Â ÃÊ.

[2] 0.003077 [3] 0.002885 [4] 0.002747 [5] 0.002637 [6] 0.002555 [7] 0.002473 [8] 0.002390

[9] 0.002363 [10] 0.002308 [11] 0.002280 [12] 0.002225 [13] 0.002198 [14] 0.002198

[15] 0.002170 [16] 0.002143 [17] 0.002143 [18] 0.002115 [19] 0.002115 [20] 0.002115

[21] 0.002088 [22] 0.002088 [23] 0.002088 [24] 0.002088 [25] 0.002088 [26] 0.002088

[27] 0.002088 [28] 0.002088 [29] 0.002088 [30] 0.002088 [31] 0.002088 [32] 0.002115

[33] 0.002088 [34] 0.002115 [35] 0.002115 [36] 0.002115 [37] 0.002143 [38] 0.002143

[39] 0.002143 [40] 0.002170 [41] 0.002170

NonrecursiveÀ϶§´Â RecursiveÀ϶§º¸´Ù Á¶±Ý ´õ º¹ÀâÇÑ ÀýÂ÷¸¦ °ÅÄ¡°Ô µÇ¹Ç·Î °á°úÀûÀ¸·Î Recursive¿´À»¶§ º¸´Ù ´À¸®´Ù. ¿©±â¼­´Â MÀÇ °ªÀÌ Recursive¿¡¼­ º¸´Ù µÚÃÄÁ® 21ÀÏ ¶§ºÎÅÍ QsortÀÇ ¼º´ÉÀÌ ÃÖÀûÀ» ³ªÅ¸³»±â ½ÃÀÛÇÏ¿´°í 31±îÁö °è¼Ó ÃÖ°íÀÇ »óŸ¦ À¯ÁöÇß´Ù. ±× ÀÌÈÄ·ÎÀÇ M°ª¿¡¼­´Â °á°úÀûÀ¸·Î Á¡Â÷ ¼º´ÉÀÌ ÀúÇϵDZ⠽ÃÀÛÇÏ¿´´Ù. À§ °á°ú¿¡¼­ MÀÌ 32¿¡¼­ ¼º´ÉÀÌ ¶³¾îÁö´Ù°¡ 33¿¡¼­ ´Ù½Ã ÃÖÀûÀÇ ¼º´ÉÀ» º¸ÀÌ°í ±× ÀÌÈÄ·Î °è¼Ó ¼º´ÉÀÌ ÀúÇϵǾú´Âµ¥, 33¿¡¼­ Àá½Ã ¼º´ÉÀÌ ÁÁ¾ÆÁø ÀÌÀ¯´Â random¿ø¼Ò°¡ ÀϽÃÀûÀ¸·Î ±× ±¸Á¶¿¡ ÁÁµµ·Ï ¹è¿­ÀÌ µÇ¾ú´ø°ÍÀ̶ó°í »ý°¢ÇÑ´Ù. Recursive¿¡¼­ º¸´Ù ÃÖÀûÀÇ M°ªÀÌ µÚ´Ê°Ô ³ª¿Â ÀÌÀ¯´Â Recursive¿¡ ºñÇØ Á¶±Ý º¹ÀâÇÑ ±¸Á¶¸¦ °¡Á®¼­ »ó´ëÀûÀ¸·Î ´À¸° Nonrecursive QsortÀÇ ¼º´ÉÀ» M°ª¿¡¼­ÀÇ Insertionsort°¡ Á¡Â÷ º¸»óÇÏ´Ù°¡ °á±¹ MÀÌ 21±îÁö °¡¼­¾ß Plus¼º´ÉÀ» º¸¿´´ø °ÍÀ̶ó°í »ý°¢µÈ´Ù. ÃÖÀûÀÇ MÀº 21°ú 31»çÀÌÀÇ Áß°£ °ªÀÎ 26ÀÌ´Ù.

* ¾Æ·¡ ¼Ò½º´Â ½ÇÁ¦ Recursive/Nonrecursive Qsort¸¦ ±¸ÇöÇÑ °ÍÀÌ´Ù.

* ¾Æ·¡ ÇÁ·Î±×·¥Àº ÇöÀç Recursive Qsort·Î µ¹¾Æ°¡µµ·Ï µÇ¾îÀÖ´Ù. ±× Qsort¸¦ È£ÃâÇÏ´Â ºÎºÐÀÌ !!!!!!!!!!!!! ¶ó°í ÁÖ¼®ÀÌ µÇ¾îÀÖ´Â ºÎºÐ¿¡ Àִµ¥, ±× ¹Ø¿¡ Nonrecursive QsortÀÎ nrquicksort()°¡ ÁÖ¼®¹®À¸·Î ¸¸µé¾îÁ® ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥À» Nonrecursive Qsort·Î µ¹¾Æ°¡°Ô Çϱâ À§Çؼ­´Â Recursive QsortÀÎ quicksort()¸¦ ÁÖ¼®¹®À¸·Î ¸¸µé°í, ÁÖ¼®¹®À¸·Î µÇ¾î ÀÖ´Â nrquicksort()¸¦ Ç®¸é µÈ´Ù.

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

#include <malloc.h>

void split(int *, int, int, int *);

void quicksort(int *, int, int);

void nrquicksort(int *, int, int);

void starttime(void);

float endtime(void);

void inssort(int *, int, int);

int pop(int *, int *);

void push(int, int);

#define TN 2000 /* 1000°³ÀÇ ¿ø¼Ò¸¦ ¹Ýº¹ÇØ °è»êÇÒ È½¼ö */

#define N 1000 /* ¿ø¼ÒÀÇ ¼ö */

#define TM 40 /* MÀÇ °ªÀ» 40ȸ¿¡ °ÅÃÄ °Ë»çÇÑ´Ù. 2ºÎÅÍ 41±îÁö. */

int M = 2; /* Ãʱâ M°ª */

unsigned long far *tick=(unsigned long far *)0x0040006c; /* ŸÀÌ¸Ó Ä«¿îÆ® µ¥ÀÌŸ ¿µ¿ª */

unsigned long st;

int insc=1;

int spc=1;

struct GoodM { /* ÃÖÀûÀÇ M°ªÁß Ã¹¹ø° °ÍÀ» ã±â À§ÇØ »ç¿ëÇÒ ±¸Á¶ */

int M;

float T;

} GM[TM], TEMP;

struct list { /* StackÀ» ±¸ÇöÇϱâ À§ÇÑ linked-list ±¸Á¶ */

struct list *parent;

int d1, d2;

} *ind=NULL;

void main()

{

int arr[N];

float t1, t2;

int t, l, tl=0, sc=1, midx=0;

long t_spc=0, t_insc=0;

srand(*tick%0xffff); /* ³­¼ö ÃʱⰪÀ» ´Ù¾çÇÏ°Ô ¼±ÅÃÇϱâ À§ÇØ... */

printf("Wait for 3secs to pass the background disk-writing by cacher...\n");

delay(3000); /* ÇÁ·Î±×·¥ÀÌ ÀÛµ¿ÇÏ´Â µµÁß¿¡ ij½¬°¡ backgroundwritingÀ»

ÇÏ°Ô µÇ¸é ¼öÇà ¼Óµµ¸¦ ÃøÁ¤Çϴµ¥ ÁöÀåÀÌ »ý±â¹Ç·Î

3Ãʸ¦ ±â´Ù¸². */

/* Estimate the time that take to make 1000000 random integer */

printf("Check randomizing time...\n");

starttime();

for (l=0; l<TN; l++)

for (t=0; t<N; t++) arr[t]=random(0xffff);

t1=endtime();

printf("Randomizing 1000x1000 ints took for %.3fsec!\n", t1);

printf("START... FROM M=2 TO 41\n");

while (tl < TM) {

starttime();

for (l=0; l<TN; l++) {

for (t=0; t<N; t++) arr[t]=random(0xffff);

/* !!!!!!!!!!!!!!!!!!!!!!! */

quicksort(arr, 0, N-1);

/* nrquicksort(arr, 0, N-1); */

t_spc+=spc;

t_insc+=insc;

spc=1;

insc=1;

}

t2=endtime();

printf("==================================================================[%03d]\n", sc++);

printf("The QSort took for <%.6f>sec for M = %d to be done.\n",(t2-t1)/TN, M);

printf("SPLIT-CALL AVR: %.1f, INSSORT-CALL AVR: %.1f\n", (float)t_spc/TN, (float)t_insc/TN);

GM[midx].M=M;

GM[midx].T=t2-t1;

t_spc=t_insc=0;

midx++;

M++;

tl++;

}

/* Find a M which has the smallest elaspsed time */

TEMP.T=GM[0].T;

for (t=1; t<midx; t++)

if (GM[t].T < TEMP.T) {

TEMP.T=GM[t].T;

TEMP.M=GM[t].M;

}

printf("\n");

for (t=0; t<TM; t++)

printf("[%d] %.6f\n", GM[t].M, GM[t].T/TN);

printf("\n\nTHE M WHICH HAS GOOD PERFORMANCE IS %d / %.6f\n", TEMP.M, TEMP.T/TN);

}

void starttime()

{

static unsigned long s;

/* timetick synchronizing */

s=*tick+10;

while (*tick < s);

/* save timetick */

st=*tick;

}

float endtime()

{

return (float)(labs(*tick-st)/18.2);

}

void inssort(int *arr, int left, int right) /* »ðÀÔÁ¤·Ä */

{

int t, i, tmp;

insc++;

for (t=left+1; t<=right; t++) {

tmp=arr[t];

for (i=t-1; i>=left && arr[i] > tmp; i--)

arr[i+1]=arr[i];

arr[i+1]=tmp;

}

}

void split(int *arr, int left, int right, int *sp)

{

int l=left, r=right+1, key;

int tmp;

if (left < right) {

spc++;

key=arr[left];

while(1) {

do l++; while (arr[l] < key);

do r--; while (arr[r] > key);

if (l < r) {

tmp=arr[l];

arr[l]=arr[r];

arr[r]=tmp;

} else break;

}

tmp=arr[left];

arr[left]=arr[r];

arr[r]=tmp;

}

*sp=r;

}

void quicksort(int *arr, int left, int right)

{

int sp;

if (right - left > M) {

if (left < right) {

split(arr, left, right, &sp);

quicksort(arr, left, sp-1);

quicksort(arr, sp+1, right);

}

} else inssort(arr, left, right);

}

void push(int d1, int d2)

{

struct list *entry;

entry=(struct list *)malloc(sizeof(*ind));

if (entry == NULL) {

printf("Not enough memory!\n");

exit(1);

}

entry->d1=d1;

entry->d2=d2;

entry->parent=ind;

ind=entry;

}

int pop(int *d1, int *d2)

{

struct list *entry;

if (ind == NULL) return 1;

*d1=ind->d1;

*d2=ind->d2;

entry=ind;

ind=ind->parent;

free(entry);

return 0;

}

void nrquicksort(int *arr, int left, int right)

{

int sp;

push(left, right);

while (!pop(&left, &right))

if (right - left > M) {

while (left < right) {

split(arr, left, right, &sp);

push(sp+1, right);

right=sp-1;

}

} else inssort(arr, left, right);

}