๐์ ๋ ฌ์ด๋?
๋ ์ฝ๋(record)๋ฅผ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋์ดํ๋ ๊ฒ.
๋ ์ฝ๋(record) : ํ๋(field)๋ผ๋ ๋จ์๋ก ๊ตฌ์ฑ๋จ.
- ํค(key) ํ๋๋ก ๋ ์ฝ๋ ๊ฐ์ ๊ตฌ๋ณ์ด ๊ฐ๋ฅํจ.
+) ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ฑ(stability)
๋์ผํ ํค ๊ฐ์ ๊ฐ๋ ๋ ์ฝ๋๋ค์ ์๋์ ์ธ ์์น๊ฐ ์ ๋ ฌ ํ์๋ ๋ฐ๋์ง ์์.
๋ํ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
O(n²) : ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ๋ฒ๋ธ ์ ๋ ฌ → ๋จ์ํ์ง๋ง ๋นํจ์จ์
O(nlogn) : ํฉ๋ณ ์ ๋ ฌ, ํต ์ ๋ ฌ, ํ ์ ๋ ฌ → ๋น๊ต์ ๋ณต์กํ์ง๋ง ํจ์จ์
(์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด๋ผ ๊ฐ์ ํ๊ณ ์ค๋ช ํฉ๋๋ค)
๐ O(n²)
# ์ ํ ์ ๋ ฌ
: ์ ๋ ฌ๋ ์ผ์ชฝ ๋ฆฌ์คํธ(์ด๊ธฐ์๋ ๋น์ด์๋ ์ํ)์ ์ ๋ ฌ๋์ง ์์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ํ๊ณ , ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์์ ๊ฐ์ ํ์ฌ ์ธ๋ฑ์ค์ ๋ค์ด์๋ ๊ฐ๊ณผ ๊ตํ.
selection_sort(A, n) :
for i <- 0 to n-2 do
least <- A[i], A[i+1], ..., A[n-1] ์ค์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ธ๋ฑ์ค;
A[i]์ A[least] ๊ตํ;
- ๋น๊ต ํ์๋ O(n²)์ด์ง๋ง ์ด๋ ํ์๋ 3(n-1)๋ก ์ ์ ํธ์ด๋ฉฐ, ์์ ์ฑ์ ๋ง์กฑํ์ง ์์.
# ์ฝ์ ์ ๋ ฌ
: ์ ๋ ฌ๋์ด ์๋ ๋ถ๋ถ์์ ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ์ฐพ์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์ . (=์ฝ์ํธ ์คํ ๋ฉ ์ ์ฅ ์ค ์๊ธฐ์ ๊ฐ์ ๋ฐฉ์)
insertion_sort(A, n) :
for i <- 1 to n-1 do //i๋ฒ์งธ ์ซ์๋ฅผ ์ฝ์
ํ๊ณ ์ ํ ๋
key <- A[i];
j <- i-1; //i๋ฒ์งธ ์ซ์ ๋ฐ๋ก ์์ ์ซ์๋ถํฐ ๋น๊ต ์์
while j>=0 and A[j]>key do
A[j+1] <- A[j]; //i๋ฒ์งธ ์ซ์๋ณด๋ค ํฐ ๊ฒ์ ํ ์นธ์ฉ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
j <- j+1;
A[j+1] <- key;
- ๋น๊ต ํ์์ ์ด๋ ํ์ ๋ชจ๋ O(n²)์ด์ง๋ง ์์ ๋ ์ ๋ ฌ ๋ฐฉ๋ฒ.
- ๋ง์ ์ด๋์ด ํ์ํ๋ฏ๋ก ๋ ์ฝ๋๊ฐ ํด ๊ฒฝ์ฐ ๋ถ๋ฆฌํ์ง๋ง, ๋๋ถ๋ถ์ ๋ ์ฝ๋๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋งค์ฐ ํจ์จ์ ์.
# ๋ฒ๋ธ ์ ๋ ฌ
: ์ธ์ ํ 2๊ฐ์ ๋ ์ฝ๋๋ฅผ ๋น๊ตํด ์ ๋ ฌ๋์ด์์ง ์์ผ๋ฉด ๊ตํ.
bubble_sort(A, n) :
for i <- n-i to 1 do
for j <- 0 to j <- i-1 do
j์ j+1๋ฒ์งธ์ ๊ฐ์ด ํฌ๊ธฐ ์์ด ์๋๋ฉด ๊ตํ
- ๋น๊ต ํ์์ ์ด๋ ํ์ ๋ชจ๋ O(n²)์ด๋ฉฐ, ๋ ์ฝ๋์ ์ด๋์ด ๊ณผ๋คํจ.
- ์ด๋๊น์ง ์ ๋ ฌ๋์ด ์๋์ง ์ ์ ์๋ ๊ฒฝ์ฐ ํจ์จ ์์น.
๐ O(nlogn)
# ํฉ๋ณ ์ ๋ ฌ
: ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ๊ท ๋ฑํ ํฌ๊ธฐ๋ก ๋ฐ๋ณต ๋ถํ ํ ํ, ๋ถํ ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ์ ๋ ฌ→ํฉ๋ณํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํจ.
merge_sort(list, left, right) :
if left<right
mid=(left+right)/2; //์ค๊ฐ ์์น๋ฅผ ๊ตฌํ ๋ค์
merge_sort(list, left, mid); //์์ชฝ ๋ถ๋ถ ๋ฐฐ์ด ์ ๋ ฌ์ ์ํ ์ํ ํธ์ถ
merge_sort(list, mid+1, right); //๋ค์ชฝ ๋ถ๋ถ ๋ฐฐ์ด ์ ๋ ฌ์ ์ํ ์ํ ํธ์ถ
merge(list, left, mid, right); //์ ๋ ฌ๋ ๋ ๋ฐฐ์ด์ ํตํฉ
- ๋น๊ต ํ์๋ O(logn), ์ด๋ ํ์๋ O(nlogn)์ด๋ฏ๋ก ๋ ์ฝ๋์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ ์๊ฐ์ ๋ญ๋น ๋ํ ์ปค์ง์ง๋ง, ์์ ๋ ์ ๋ ฌ ๋ฐฉ๋ฒ.
- ๋ฐ์ดํฐ์ ์ด๊ธฐ ๋ถ์ฐ ์์์ ์ํฅ์ ๋ ๋ฐ์.
- ๋ ์ฝ๋๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑํด ํฉ๋ณ ์ ๋ ฌํ ๊ฒฝ์ฐ, ๋งค์ฐ ํจ์จ์ !
# ํต ์ ๋ ฌ
: ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ๋น๊ท ๋ฑ ๋ฆฌ์คํธ๋ก ๋ถํ ํด ๊ฐ ๋ฆฌ์คํธ๋ฅผ ํต ์ ๋ ฌํจ.
(๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ผ๋, ์ ๋ณต ๊ณผ์ ์์ด ์ ๋ ฌ๋จ!)
quick_sort(list, left, right) :
if left<right //์ ๋ ฌํ ๋ฒ์๊ฐ 2๊ฐ ์ด์์ ๋ฐ์ดํฐ์ด๋ฉด
q <- partition(list, left, right); //ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๋ถํ
quick_sort(list, left, q-1); //ํผ๋ฒ ๋ฐ๋ก ์๊น์ง ํต ์ ๋ ฌ ์ํ ํธ์ถ
quick_sort(list, q+1, right); //ํผ๋ฒ ๋ฐ๋ก ๋ค๋ถํฐ ํต ์ ๋ ฌ ์ํ ํธ์ถ
partition(list, left, right) :
low <- left; high <- right+1; pivot <- list[left];
while(low<high) //low์ high๊ฐ ๋ง๋๊ธฐ ์ ๊น์ง
while(low<=right && list[low]<pivot) do
low++; //์์์๋ถํฐ ์ด๋ํ๋ค list[low]>pivot์ด๋ฉด ๋ฉ์ถ๊ณ
while(high>=left && list[high]>pivot) do
high--; //๋ค์์๋ถํฐ ์ด๋ํ๋ค list[high]<pivot์ด๋ฉด ๋ฉ์ถฐ์
if low<high
swap(list[low], list[high]); //๋์ด ๊ตํ
swap(list[left], list[high]); //์ดํ ํผ๋ฒ์ ์ ์์น๋ก ์ด๋
return high;
- ๋น๊ต ํ์๋ O(nlogn)์ด๊ณ ์ด๋ ํ์๋ ์์ผ๋ฏ๋ก, ํ๊ท ์ ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ ๋ฐฉ๋ฒ.
- ๋ค๋ง ๊ทน๋๋ก ๋ถ๊ท ๋ฑํ ๋ฆฌ์คํธ๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ, ๋น๊ต ํ์๊ฐ O(n²)์ด ๋จ.
- ์ค๊ฐ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ํํด ๋ถ๊ท ๋ฑ ๋ถํ ์ ์ํํ๋ ๋ฐฉ์ ์ด์ฉ.
# ํ ์ ๋ ฌ
: ์ ๋ ฌํ ์์๋ค์ ์ต์ ํ(min heap)์ ์ฝ์ ํ ์ญ์ ์ฐ์ฐ์ ํตํด ํ์ผ๋ก๋ถํฐ ์์๋ฅผ ํ๋์ฉ ์ ์ฅํจ.
+) ํ์์์ ์ญ์ ์ฐ์ฐ
(1) ๋ฃจํธ ๋ ธ๋ ์ญ์ .
(2) ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ์ด๋.
(3) ๋ฃจํธ์์๋ถํฐ ๋จ๋ง ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก์ ์๋ ๋ ธ๋๋ค์ ๊ตํํด, ํ์ ์ฑ์ง์ ๋ง์กฑ์ํด.
- n๋ฒ์ ์ญ์ ์ฐ์ฐ์ด๋ฏ๋ก O(nlogn).