ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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)$ 

     

    ๋Œ“๊ธ€

Designed by Tistory.