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);
}