์นตํ ์ผ ์ ฐ์ด์ปค ์ ๋ ฌ (Cocktail Shaker Sort) ์๊ณ ๋ฆฌ์ฆ :
์นตํ ์ผ ์ ฐ์ด์ปค ์ ๋ ฌ(Cocktail Shaker Sort) = ์๋ฐฉํฅ ๋ฒ๋ธ ์ ๋ ฌ(Bidirectional Bubble Sort)
= ์ ฐ์ด์ปค ์ ๋ ฌ(Shaker Sort) = ์นตํ ์ผ ์ ๋ ฌ(Cocktail Sort)
๋ฒ๋ธ ์ ๋ ฌ ์ ๋ณํ. ๋ฒ๋ธ ์ ๋ ฌ๊ณผ๋ ๋ฌ๋ฆฌ ๋งค ํจ์ค๋ง๋ค ๋ฆฌ์คํธ์ ์์๋ฅผ ๋ฐ๊ฟ ์ ๋ ฌ
ํ์ ๋ฒ์งธ์ ํจ์ค๋ ๊ฐ์ฅ ์์ ์์๋ฅผ ๋งจ ์์ผ๋ก, ์ง์ ๋ฒ์งธ์ ํจ์ค๋ ๊ฐ์ฅ ํฐ ์์๋ฅผ ๋งจ ๋ค๋ก ์ ๋ ฌ or
ํ์ ๋ฒ์งธ์ ํจ์ค๋ ๊ฐ์ฅ ํฐ ์์๋ฅผ ๋งจ ๋ค๋ก, ์ง์ ๋ฒ์งธ์ ํจ์ค๋ ๊ฐ์ฅ ์์ ์์๋ฅผ ๋งจ ์์ผ๋ก ์ ๋ ฌ
์ฒซ๋ฒ์งธ ํจ์ค๊ฐ ์๋ฃ๋๋ฉด ๊ฐ์ฅ ์์ ์์๊ฐ ๋งจ ์์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์
๋๋ฒ์งธ ํจ์ค๋ ๋งจ ์์ ์์๋ฅผ ์ ์ธํ๊ณ ์ -> ๋ค ๋ฐฉํฅ์ผ๋ก ์งํ๋๊ณ ,
๋๋ฒ์งธ ํจ์ค๊ฐ ์๋ฃ๋๋ฉด ๊ฐ์ฅ ํฐ ์์๊ฐ ๋งจ ๋ค๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์
์ธ๋ฒ์งธ ํจ์ค๋ ์ ๋์ ๋ ์์๋ฅผ ์ ์ธํ๊ณ ๋ค -> ์ ๋ฐฉํฅ์ผ๋ก ์งํ๋๋ค.
=> ํจ์ค๊ฐ ํ๋ฒ์ฉ ์งํ๋ ๋ ๋ง๋ค ์ ๋ ฌ์์ ์ ์ธ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ๋์์ ๋ฒ๊ฐ์ ํ๋์ฉ ์ ์ธ๋๋ค
๋ฉ์๋ swap() : a[idx1] ๊ณผ a[idx2] ๋ฅผ ๊ตํ
๋งค๊ฐ๋ณ์ : int[] a, int idx1, int idx2
๋ฉ์๋ CockTailSort() : ๊ธธ์ด๊ฐ n์ธ ๋ฐฐ์ด a๋ฅผ ์นตํ ์ผ ์ ๋ ฌ
๋งค๊ฐ๋ณ์ : int[] a, int n
- ์นตํ
์ผ ์ ๋ ฌ :
void swap(int[] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[idx2] = t;
}
void CocktailSort(int[] a, int n) {
int i = 1;
int l = 0;
int r = n-1;
int last = n-1;
while(l != r) {
if(i % 2 == 1) {
for(int j = r; j > l; j--) {
if(a[j-1] > a[j]) {
swap(a, j-1, j);
last = j;
}
}
l = last;
} else if (i % 2 == 0) {
for(int j = l; j < r; j++) {
if(a[j] > a[j+1]) {
swap(a, j, j+1);
last = j;
}
}
r = last;
}
i++;
}
}
์นตํ ์ผ ์์ด์ปค ์ ๋ ฌ Cocktail Shaker Sort :
์ต์ = O(N), ํ๊ท = ์ต์ = O(N^2)
์์ ๋ ์ ๋ ฌ