์ ธ ์ ๋ ฌ (Shell Sort) ์๊ณ ๋ฆฌ์ฆ :
์ฝ์ ์ ๋ ฌ ์ ์ฅ์ ์ ์ด๋ฆฌ๊ณ ๋จ์ ์ ๋ณด์ํ์ฌ ์ข ๋ ๋น ๋ฅด๊ฒ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ, ๋ถ์์ ์ ๋ ฌ.
์ ๋ ฌํ ๋ฐฐ์ด์ ์์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋๋ ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ์ฝ์ ์ ๋ ฌ์ ์ํํ๊ณ ,
๊ทธ ๊ทธ๋ฃน์ ํฉ์น๋ฉด์ ์ ๋ ฌ์ ๋ฐ๋ณตํ์ฌ ์์์ ์ด๋ ํ์๋ฅผ ์ค์
์ฝ์ ์ ๋ ฌ์ ์ฅ/๋จ์
์ฅ์ : ์ ๋ ฌ์ ๋ง์ณค๊ฑฐ๋ ์ ๋ ฌ์ ๋ง์น ์ํ์ ๊ฐ๊น์ฐ๋ฉด ์ ๋ ฌ ์๋๊ฐ ๋นจ๋ผ์ง๋ค
๋จ์ : ์ฝ์ ํ ์์น๊ฐ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ผ๋ฉด ์ด๋(์ฝ์ )ํด์ผ ํ๋ ํ์๊ฐ ๋ง์์ง๋ค
์ ธ ์ ๋ ฌ์ ์ ์ฒด์ ๋ฐฐ์ด์ ํ๋ฒ์ ์ ๋ ฌํ์ง ์๊ณ
์ ๋ ฌํด์ผ ํ ๋ฐฐ์ด์ ์ผ์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ถ๋ฅํ์ฌ ์ฐ์์ ์ด์ง ์์ ์ฌ๋ฌ ๊ฐ์ ๋ถ๋ถ ๊ทธ๋ฃน์ ๋ง๋ค์ด ๊ฐ ๊ทธ๋ฃน์ ์ฝ์ ์ ๋ ฌํ๋ค.
๋ถ๋ถ ๊ทธ๋ฃน์ ๊ตฌ์ฑํ ๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฐ K๋ฒ์งธ ์์๋ฅผ ์ถ์ถํ์ฌ ๋ง๋๋๋ฐ, ์ด K๋ฅผ ๊ฐ๊ฒฉ(gap)์ด๋ผ ํ๋ค.
๊ฐ ๋จ๊ณ๋ณ๋ก ํ๋์ ๋ถ๋ถ ๊ทธ๋ฃน์ ์์ ๊ฐ์๋ ์ฆ๊ฐ, gap์ ๊ฐ์ํ๋ฉฐ gap์ด 1์ด ๋ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค.
์ค์ ๋ก ์ฌ๋ฌ๊ฐ์ ๋ฐฐ์ด๋ก ๋๋๋ ๊ฒ์ด ์๋๋ผ, ๋จ์ํ gap ๊ฐ์ผ๋ก ๊ฐ๊ฒฉ์ ์ฃผ์ด ๋ถ๋ถ ๊ทธ๋ฃน์ด ๋ง๋ค์ด์ง ๊ฒ ์ฒ๋ผ ๊ตฌํํ๋ค.
์ฝ์ ์ ๋ ฌ์ ๋นํด ์ ๋ ฌ ํ์๋ ์ฆ๊ฐํ์ง๋ง ์ ์ฒด์ ์ผ๋ก๋ ์์์ ์ด๋ ํ์๊ฐ ์ค์ด๋ค์ด ๋ ํจ์จ์ ์ด๋ค.
int shell = {8, 1, 4, 2, 7, 6, 3, 5}
1. 4์นธ๋งํผ ๋จ์ด์ง ์์๋ฅผ ๋ชจ์ ๋ฐฐ์ด์ 4๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ์ฝ์ ์ ๋ ฌ ( gap = 4 )
2. 1๋ฒ ์ ๋ ฌ์ ๋ง์น ์ํ์์ 2์นธ๋งํผ ๋จ์ด์ง ์์๋ฅผ ๋ชจ์ ๋ฐฐ์ด์ 2๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ์ฝ์ ์ ๋ ฌ ( gap = 2 )
3. 2๋ฒ ์ ๋ ฌ์ ๋ง์น ์ํ์์ ์ฝ์ ์ ๋ ฌ ( gap = 1 )
shell์ ๊ฒฝ์ฐ gap๊ฐ์ 4, 2, 1(gap/2)๋ก ๊ฐ์ํ๋ฉฐ 7ํ์ ์ ๋ ฌ๋ก ์ ๋ ฌ์ ๋ง์ณค๋ค.
์ ธ ์ ๋ ฌ์ gap๊ฐ์ ๋ฐ๋ผ ์๊ฐ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ gap๊ฐ์ ์ค์ ์ด ์ค์ํ๋ฐ
๋ณดํต ์ ธ ์ ๋ ฌ์์ gap์ ์ ์ฒด ๋ฐฐ์ด์ ์์ ์ N์ 2๋ก ๋๋๋ ๊ฐ์ผ๋ก ์งํํ์ง๋ง, ๋ณดํต ์ง์๋ณด๋ค๋ ํ์๊ฐ ๋ ๋น ๋ฅด๊ณ , 3์ผ๋ก ๋๋๊ณ 1์ ๋ํ๋ ๊ฒฝ์ฐ(N/3+1)๊ฐ ๋ ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ ์๋ค.
๋ฉ์๋ shellSort() : ๊ธธ์ด๊ฐ n์ธ ๋ฐฐ์ด a๋ฅผ ์ ธ ์ ๋ ฌ
๋งค๊ฐ๋ณ์ : int[] a, int n
- ์ ธ ์ ๋ ฌ
void shellSort(int[] a, int n) {
int h = n;
do {
h = h/3+1;
for(int i = h; i < n; i++) {
int j;
int tmp = a[i];
for(j = i-h; j >= 0 && a[j] > tmp; j -= h) {
a[j + h] = a[j];
}
a[j+h] = tmp;
}
} while(h != 1);
}
์ ธ ์ ๋ ฌ Shell Sort :
์ต์ = O(N), ํ๊ท = O(N^1.5), ์ต์ = O(N^2)
๋ถ์์ ํ ์ ๋ ฌ