-
Selection Sort , Merge Sort, ๊ทธ๋ฆฌ๊ณ ์ฆ๋ชPROGRAMMING/์๋ฃ๊ตฌ์กฐ 2020. 6. 18. 16:22
Sotring ์ ๋ํ ์ฆ๋ช ๋ฐฉ๋ฒ
-์ ๋ ฅ: a[0], a[1], ... , a[n-1] : ์งํฉ
- Sorting ์ด ์๋ฃ๋ ํ ๋ค์์ด ๋ง์กฑ๋์ด์ผ ํจ
- Sorting ์ด ๋๋ ํ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ๋ค์ b[0], b[1], ..., b[n-1] ์ด๋ผ๊ณ ๋ถ๋ฅด์
- ์กฐ๊ฑด 1: a ๋ฐฐ์ด๊ณผ b ๋ฐฐ์ด์ ๊ฐ๋ค์ ์งํฉ์ผ๋ก ๊ฐ์
- ์กฐ๊ฑด 2 : b[0]<b[1]< ... < b[n-1] (ํธ์์ ๊ฐ์ ๊ฐ์ ์๋ค๊ณ ๊ฐ์ )
Selection Sort (์ ํ ์ ๋ ฌ) : ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๋น๊ตํด์ ์์๊ฐ/ํฐ๊ฐ ์ ์์ผ๋ก ๊ฐ์ ธ์ค๊ณ ๋จ์ ๊ตฌ๊ฐ๋ค์ ๋์ผํ ์์ ์ ํด์ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ. ์ฆ, ๋ฐฐ์ด์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์์ผ๋ก ๊ฐ์ ธ์ค๋ ์์ ๋ฐ๋ณต.
* Selection Sort in C (iterative process)
void selectionSort(int a[], int n){ int i, j, t; for(i=0; i<n-1; i++){ for(j=i+1; j<n; j++){ if(a[j]>a[i]){ t=a[j]; a[j]=a[i]; a[i]=t; //a[i] = a[i]^a[j]; //a[j] = a[i]^a[j]; //a[i] = a[i]^a[j]; } } } }
์๊ฐ๋ณต์ก๋(Complexity): $O(n^2)$ (n ๊น์ง for ๋ฌธ์ n ๋ฒ ๋๊ธฐ ๋๋ฌธ)
Selection Sort ์ฆ๋ช by Invariant
- ์กฐ๊ฑด 1 : ์งํฉ ์กฐ๊ฑด์ ๊นฐ ์ ์๋ ์ฝ๋๋ ์๋ค. ๊ฐ๋ค์ ๊ฐ์ง๊ณ ๊ตํ๋ง ํจ.
- ์กฐ๊ฑด 2: Proof Invariant by Induction
- invariant : k ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ ํ์
(1) a[0]<a[1]<...<a[k-1]
(2) a[k-1] < a[x] if x>k-1
- (Base) k=0 ์ผ ๋ ์๋ฌด ๋ฃจํ๋ ๋์ง ์์. null condition. ๋ง์กฑ์์ผ์ผํ ๊ฒ ์๋ค.
- (Step) k ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ฌ์ ๋ invariant ๊ฐ ์ฑ๋ฆฝํ๋ค๋ฉด, k+1 ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ฌ์ ๋๋ ์ฑ๋ฆฝํ๋ค.
invariant 1: k ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ ํ
- (1) a[0]<a[1]<...<a[k-1]
- (2) a[k-1]<a[x] if x>k-1
invariant 2: k+1 ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ ํ
- (1) a[0]<a[1]<...<a[k-1]<a[k]
- (2) a[k]<a[x] if x>k
k ๋ฒ์งธ ๋ฃจํ๊ฐ ๋๋ ํ์ ๋จ์ ๊ฐ๋ค a[k], ..., a[n-1] ์ค ์ต์๊ฐ์ a[k] ๋ก ์ฎ๊น.
=> a[k] ๋ invariant 1 ์ 'a[x]' ์์ ์๋ ๊ฐ์ผ๋ก a[0]~a[k-1] ๋ณด๋ค ํด ์๋ฐ์ ์๊ณ , ์ต์๊ฐ์ ์ฎ๊ธด ๊ฒ์ด๋ ๋จ์ a[k+1},...,a[n-1] ์ ๊ฐ๋ค์ ๋ชจ๋ a[k] ๋ณด๋ค ํฐ ๊ฐ!
invariant ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋๋์๋ ์ฑ๋ฆฝํด์ผ ํจ์ผ๋ก, ๋ชจ๋ ๋ฃจํ๊ฐ ๋๋ฌ์ ๋
(1) a[0]<a[1]<...<a[n-1]
(2) a[k-1] < a[x] if x>k-1
์์ ํตํด invariant ๊ฐ ์ฑ๋ฆฝํจ์ ์ ์ ์๋ค.
* Selection Sort in C (recursive process)
int selectionSort(int a[], int n){ int i, m, t; m=0; if(n==1) return; for(i=0; i<n; i++){ if(a[m]>a[i]) m=i; } t=a[0]; a[0]=a[m]; a[m]=t; selectionSort(a+1, n-1); return;
proof by induction
- ์กฐ๊ฑด 1: ์งํฉ ์กฐ๊ฑด์ ๊นฐ ์ ์๋ ์ฝ๋๋ ์ง๊ธ๋ ์์.
- ์กฐ๊ฑด 2:
- (Base) n=1 ์ผ ๋, return. ์ํํ ์ผ์ด ์์
- (Step)
- n-1 ์ผ ๋ selectionSort ํจ์๊ฐ ์ฑ๊ณตํ๋ค๋ฉด (์ฌ๊ท์ ๊ฐ์ . ์ผ๋จ ๋ฏฟ์)
=> ์ฆ, a[1]<a[2]<...<a[n-1] ์ด๋ผ๋ฉด
- n ์ผ ๋ selectionSort ํจ์๊ฐ ์ฑ๊ณตํ๋ค.
=> ์ฆ, a[0]<a[1]<a[2]<...<a[n-1] ์ ๋ง์กฑํ๋ค.
n์ผ ๋ ์ฌ๊ทํธ์ถ n-1 ์ ํ๋ค. ์ด ๋ n-1 ์ ์ฌ๊ทํธ์ถ๋ก ๋๊ธฐ๋ ๊ฐ์ ๊ฐ์ฅ ์์ ๊ฐ a[0] ๋ฅผ ๋บ (a+1) ์ด๋ค.
๊ทธ๋ฐ๋ฐ n-1 ์ผ ๋ sorting ์ด ์๋ฃ๋๋ค๋ ๊ฒ์ ๋ฏฟ์ผ๋, n ์ผ๋ก ๋ค์ ๋์์์ ๋ ์ ์ผ ์์๋ a[0] ๋ฅผ ์์ ๋ถ์ฌ์ฃผ๋ฉด ์กฐ๊ฑด 2๋ฅผ ๋ง์กฑํ๊ฒ ๋๋ค. ๋ค์ ๋งํด, ์ฌ๊ทํธ์ถ ํ๊ธฐ ์ ์ a[0] ๋ ๋๋จธ์ง๋ณด๋ค ์์๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง์ ํฌ๊ธฐ ๊ด๊ณ(์กฐ๊ฑด2) ๊ฐ ๋ง์กฑํ๋ a[0] ์ ํฉ์ณ๋ ์ฌ์ ํ ์กฐ๊ฑด 2๋ฅผ ๋ง์กฑํ๋ค๋ ๊ฒ์ด๋ค.
์๊ฐ๋ณต์ก๋(Complexity): $O(n^2)$ (n ๊น์ง for ๋ฌธ์ n ๋ฒ ๋๊ธฐ ๋๋ฌธ)
T(n) = n + T(n-1)
= n + n -1 + T(n-2) = ...
∴ T(n) = $O(n^2)$
Merge Algorithm (ํฉ๋ณ/๋ณํฉ ์ ๋ ฌ) :
- input: ์ ๋ ฌ๋ ๋ฐฐ์ด 2๊ฐ
- Algorithm: ์ด ๋ ๋ฐฐ์ด์ ํฉํจ.
1) ๋ ๋ฐฐ์ด์ ์ ์ผ ์์ ๋น๊ตํด์ ์ ์ผ ์์ ๊ฒ์ ์๋ก์ด ๋ฐฐ์ด๋ก ์ฎ๊น
2) ๋จ์ ๊ฒ๋ค ์ค ์์ ๋ ๊ฐ ๋น๊ตํด์ ์์ ๊ฒ์ ์ฎ๊น. ์ด ์์ ์ ๋ฐ๋ณต.
- output : ๋ ๋ฐฐ์ด์ ํฉ์งํฉ๋ง ๋ฐฐ์ด์ Sorting ํ ๋ฐฐ์ด
=> ๋ ๊ฐ์ฉ merge ํ๋ฉด์ ๊ณ์ ์๋ก ์ฌ๋ผ์ค๋ ๊ฒ. ๊ทธ ๊ฒฐ๊ณผ๋ Sorting !!
* Recursive Merge Sort (simple)
int mergeSort(int a[], int n){ int h; int b[n]; h=n/2; //copy a[] to b[] mergeSort(b, h); mergeSort(b+h, n-h); // b ์์ a ๋ก merge return; }
proof by Induction
- ์กฐ๊ฑด 1: ์งํฉ ์กฐ๊ฑด์ ์์ง๋ ๊นฐ ์ ์์. a ์์ b ๋ก ์์ ํ ๋ณต์ฌ๋๊ณ , mergeSort ๋ก ์ฌ๊ทํธ์ถํ ๋ b ๋ b ์ b+h ์ ๋๋ก ๋๋์ด์ ์ฌ๊ท์ ์ผ๋ก ์งํฉ ์กฐ๊ฑด์ ๊นจ์ง ์๋๋ค. merge algorithm ๋ ์ญ์ ๋์ ํฉ์งํฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ฏ๋ก ์งํฉ ์กฐ๊ฑด์ ๊นจ์ง ์๋๋ค.
- ์กฐ๊ฑด 2:
- (Base) n=1 ์ผ ๋, ์ํํ ์ฌํญ ์์
- (Step)
- n/2์ผ ๋, mergeSort ํจ์๊ฐ ์ฑ๊ณตํ๋ค๋ฉด
=> ์ฆ, ์ฌ๊ทํธ์ถ ํ a[0]<a[1]<...<a[n/2-1] and a[n/2]<a[n/2+1]<....<a[n-1] ์ ๋ง์กฑํ๋ค๋ฉด
- n ์ผ ๋ emrgeSort ํจ์๊ฐ ์ฑ๊ณตํ๋ค.
=> ์ฆ, a[0]<a[1]<...<a[n/2-1] < a[n/2]<a[n/2+1]<....<a[n-1] ์ ๋ง์กฑ
์ด๋ ๊ท๋ฉ์ ์ผ๋ก ์ฌ์ค์ด๋ผ๊ณ ๋ฏฟ๊ณ ์๊ณ , ์ฑ๋ฆฝํ๋ ๊ฒ๊ณผ + merge Algorithm ์ ์ ํ์ฑ์์๋ถํฐ ์ ์ ์๋ค.
์๊ฐ๋ณต์ก๋(Complexity) : $O(n log n)$
T(n) = n + 2T(n/2)
= n + 2(n/2 + 2T(n/4)
= n + 2(n/2 + 2(n/4 + 2T(n/8))
= .... = n log n
∴ T(n) = $O(n log n)$
์ด ์์ ๊ณ์ ์์ผ๋ก ๋ค์ด๊ฐ๋๋ฐ T(1) ์ด ๋๋ฉด ์์ด์ง๋ค.
์ด๋ log n ๋ฒ ๋ด๋ ค๊ฐ์ผ ํจ์ ์๋ฏธํจ (n ์ ๋ช ๋ฒ ๋๋๋ฉด 1์ด ๋๋๋)
ํ ๋ฒ์ mergeSort ํจ์๋ (๊ฑฐ์) n ์๊ฐ์ผ๋ก ๋ณด๋ฉด ๋๋ค.
(copy ์ n, sort ์ ๊ฐ๊ฐ n/2 ์ฉ, merge ์๋ n)
์ด์ ์ selection sort ์ ๋น๊ตํด์ , ์๋ฑํ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์๊ฐ๋ณต์ก๋๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Algorithm Complexity selection sort (iterative) $O(n^2)$ selection sort (recursion) $O(n^2)$ merge sort (recursion) $O(n log n)$ 'PROGRAMMING > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Arrays(๋ฐฐ์ด), Binary Search(์ด์ง ํ์), ์ฆ๋ช , ๊ทธ๋ฆฌ๊ณ log (0) 2020.06.18 ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ ์ฆ๋ช (0) 2020.06.18 ์ํ์ ๊ท๋ฉ๋ฒ (0) 2020.06.18 ๋ณ์์ ํฌ์ธํฐ (0) 2020.06.18