๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿ”

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‰˜ ์ •๋ ฌ (Shell Sort)

์‰˜์ •๋ ฌ์ด๋ž€, ์„ ํƒ์ •๋ ฌ์˜ ์ธ์ ‘ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ” ๊ทธ๋ฃน์„ ๋‚˜๋ˆ„์–ด, ๊ทธ๋ฃน๋งˆ๋‹ค์˜ ์„ ํƒ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋А๋ ค์ง์„ ์™„ํ™”ํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ด๋‹ค.  ( ์‰˜ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ๊ทธ๋ฃน์˜ ํฌ๊ธฐ๋งŒํผ ๋ ˆ์ฝ”๋“œ ์ด๋™์ด ๊ฐ€๋Šฅํ•ด์ง! )

void ShellSort(int A[], int n){
    //์ž…๋ ฅ : A[0:n-1],n: ์ •๋ ฌํ•  ์›์†Œ์˜ ๊ฐœ์ˆ˜
    //์ถœ๋ ฅ : A[0:n-1] : ์ •๋ ฌ๋œ ๋ฐฐ์—ด
    int h,i,j,Value;
    h=1;
    do h = 3*h+1; while (h < n);
    //n์„ ๋„˜์ง€ ์•Š๋Š” h๊ฐ’์„ ์ฐพ์•„์„œ ์ง„ํ–‰
    //n์ด 15๋ผ๋ฉด, h=13 -> h->4 -> h=1๋กœ ์ง„ํ–‰๋œ๋‹ค.
    do {
        h=h/3;
        for (i=h; i<n; i++){
            Value = A[i];
            j=i;
            while(A[j-h]>Value){
                A[j]=A[j-h];
                j -= h;
                if (j<h) break;
            } A[j] = Value;
        }
        while (h>1);

์‰˜์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๋Š” ์ผ๋ฐ˜์  ๊ณต์‹

n์„ ๋„˜์ง€ ์•Š๋Š” h๊ฐ’์„ ์ฐพ์•„์„œ ์ง„ํ–‰ํ•œ๋‹ค.

์„ ํƒ์ •๋ ฌ๊ณผ์˜ ์ฐจ์ด์  : ์ด์ „๊ฐ’๊ณผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด์ „ ๊ทธ๋ฃน์˜ ๊ฐ™์€ ์ˆœ์„œ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ๋‹ค๋ฉด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

 

  • ์ œ์ž๋ฆฌ์„ฑ : ์ œ์ž๋ฆฌ ์ •๋ ฌ (์ƒ์ˆ˜ํฌ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ)
  • ์•ˆ์ •์„ฑ : ๋ถ„์•ˆ์ •ํ•œ ์ •๋ ฌ (์ธ์ ‘ํ•œ ๋ ˆ์ฝ”๋“œ์™€ ์ž๋ฆฌ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ)
  • ์ตœ์•…์‹œ๊ฐ„๋ณต์žก๋„ :  n์˜3/2์ œ๊ณฑ (์‹ค์ œ ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์€ h๊ฐ’ ์„ค์ •์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.)