Skip to content

Latest commit

ย 

History

History
414 lines (307 loc) ยท 14.3 KB

File metadata and controls

414 lines (307 loc) ยท 14.3 KB

์ •๋ ฌ

๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ / ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ด ํ•˜๋Š” ๊ฒƒ.

โœ” ์ข…๋ฅ˜



โœ” ์‹œ๊ฐ„ ๋ณต์žก๋„ ( Big-O )


์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์„  ํ‰๊ท  ์ตœ์•…
์„ ํƒ ์ •๋ ฌ โ„ฆ(n^2) ฮ˜(n^2) O(n^2)
๋ฒ„๋ธ” ์ •๋ ฌ โ„ฆ(n) ฮ˜(n^2) O(n^2)
์‚ฝ์ž… ์ •๋ ฌ โ„ฆ(n) ฮ˜(n^2) O(n^2)
ํŠธ๋ฆฌ ์ •๋ ฌ โ„ฆ(nlogn) ฮ˜(nlogn) O(n^2)
ํ€ต ์ •๋ ฌ โ„ฆ(nlogn) ฮ˜(nlogn) O(n^2)
์…ธ ์ •๋ ฌ โ„ฆ(n) ฮ˜(n^1.5) O(n^1.5)
ํž™ ์ •๋ ฌ โ„ฆ(nlogn) ฮ˜(nlogn) O(nlogn)
ํ•ฉ๋ณ‘ ์ •๋ ฌ โ„ฆ(nlogn) ฮ˜(nlogn) O(nlogn)
ํ๋ธŒ ์ •๋ ฌ โ„ฆ(n) ฮ˜(nlogn) O(nlogn)
ํŒ€ ์ •๋ ฌ โ„ฆ(n) ฮ˜(nlogn) O(nlogn)
๊ธฐ์ˆ˜ ์ •๋ ฌ โ„ฆ(nk) ฮ˜(nk) O(nk)
๊ณ„์ˆ˜ ์ •๋ ฌ โ„ฆ(n+k) ฮ˜(n+k) O(n+k)



โœ” ๊ณต๊ฐ„ ๋ณต์žก๋„ ( Big-O )


์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์•…
์„ ํƒ ์ •๋ ฌ O(1)
๋ฒ„๋ธ” ์ •๋ ฌ O(1)
์‚ฝ์ž… ์ •๋ ฌ O(1)
์…ธ ์ •๋ ฌ O(1)
ํž™ ์ •๋ ฌ O(1)
ํ€ต ์ •๋ ฌ O(logn)
ํ•ฉ๋ณ‘ ์ •๋ ฌ O(n)
ํ๋ธŒ ์ •๋ ฌ O(n)
ํŠธ๋ฆฌ ์ •๋ ฌ O(n)
ํŒ€ ์ •๋ ฌ O(n)
๊ณ„์ˆ˜ ์ •๋ ฌ O(k)
๊ธฐ์ˆ˜ ์ •๋ ฌ O(n+k)



์ •๋ ฌ์˜ ํŠน์„ฑ

  • ์•ˆ์ • ์ •๋ ฌ ( stable sort )

    • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ๊ฐ™์€ ํ‚ค๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ์œ ์ง€ ๋˜๋Š” ์ •๋ ฌ

    • ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋‚˜ ํ‚ค๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฐ’๋“ค์„ ์ •๋ ฌ ํ•˜๋ ค๊ณ  ํ• ๋•Œ ์›๋ž˜์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด ์•ˆ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋•Œ๋Š” stableํ•œ sort๋ฅผ ์ด์šฉํ•ด์•ผํ•œ๋‹ค.

    • Bubble, Insertion, Merge, Counting, Bucket, Radix Sort๊ฐ€ ํ•ด๋‹น๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ 5์ด๋”๋ผ๋„ a๊ฐ€ ์•ž์— ์žˆ๋Š” 5, b๊ฐ€ ๋’ค์— ์žˆ๋Š” 5๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

  3 5(a) 1 4 5(b) 2

  ์ด ์ •๋ ฌ ํ›„์—

  1 2 3 4 5(a) 5(b)

  ์™€ ๊ฐ™์ด ๊ฐ™์€ ํ‚ค๊ฐ’์˜ ์›์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€ ๋˜๋Š” ๊ฒƒ.
  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ ( unstable sort )

    • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ๊ฐ™์€ ํ‚ค๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์— ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์—†๋Š” ์ •๋ ฌ

    • Selection, Shell, Heap, Quick Sort๊ฐ€ ํ•ด๋‹น๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ 5์ด๋”๋ผ๋„ a๊ฐ€ ์•ž์— ์žˆ๋Š” 5, b๊ฐ€ ๋’ค์— ์žˆ๋Š” 5๋ผ๊ณ  ํ•œ๋‹ค๋ฉด

  3 5(a) 1 4 5(b) 2

  ์ด ์ •๋ ฌ ํ›„์—

  1 2 3 4 5(b) 5(a)

  ์™€ ๊ฐ™์ด ๊ฐ™์€ ํ‚ค๊ฐ’์˜ ์›์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ.



Selection Sort

  • Unstable sort
  • ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์„ฑํ•  ํ•„์š” X
  • ๋ฐฐ์—ด ์ญ‰ ํƒ์ƒ‰ ํ›„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“๋Š” ๋ฐฉ์‹
    int min;
    /*๋ฐฐ์—ด์„ ์ˆœ์ฐจ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ œ์ผ ์ตœ์†Ÿ๊ฐ’์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ •๋ ฌ*/
    for(int i=0; i<arrlen-1;i++){
        min=i;
        for(int j=i+1;j<arrlen;j++){
            //์ตœ์†Ÿ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค search
            if(array[j]<array[min]) min=j;
        }
        swap( &array[i], &array[min] );  //๊ฐ€์žฅ ์ž‘์€๊ฐ’์„ ์™ผ์ชฝ์œผ๋กœ ์ด๋™

    }

Code ๋ณด๊ธฐ (c++)


Insertion Sort

  • Stable sort

  • ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์„ฑํ•  ํ•„์š” X

  • ์ธ๋ฑ์Šค๊ฐ’์„ ํ•œ๊ฐœ์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ ํ•ด๋‹น ๊ฐ’์ด ๋งž๋Š” ์œ„์น˜์— ์‚ฝ์ž…

  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ชจ๋‘ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ best case ๊ฒฝ์šฐ O(n)์œผ๋กœ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค.

    for(int i=1;i<arrlen;i++){
        item=array[i];

        /*๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ€ ์•„๋‹ˆ๊ณ , ์•ž์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๊ต์ฒด*/
        for(j=i-1;j>=0 && item < array[j] ;j--)
            array[j+1]=array[j];
        array[j+1]=item;
    }

Code ๋ณด๊ธฐ (c++)


Bubble Sort

  • Stable sort

  • ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์„ฑํ•  ํ•„์š” X

  • ๋ฐฐ์—ด์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์Œ“๋Š”๋‹ค.

    /*ํ•œ๋ฒˆ ํƒ์ƒ‰ํ• ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ๋์— ์ œ์ผ ํฐ ๊ฐ’์ด ์ฑ„์›Œ์ง€๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ๊ธธ์ด-1๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์ด ๋ˆ๋‹ค*/
        for(int i=arrlen-1;i>0;i--){
            /*๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ๋ถ€ํ„ฐ ๋‹ค์Œ ๊ฐ’๊ณผ ๋น„๊ตํ•ด๋ณด๋ฉด์„œ ํฐ ๊ฐ’์€ ์ ์  ๋’ค๋กœ ๋ฏผ๋‹ค*/
            for(int j=0;j<i;j++)
                if(array[j]>array[j+1]) swap(&array[j],&array[j+1]);

Code ๋ณด๊ธฐ (c++)


Merge Sort

  • stable sort

  • ๋ถ„ํ• ๊ณผ ์ •๋ณต ์›๋ฆฌ ( Divide & Conquer )

  • ๋”์ด์ƒ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•˜๋‹ค๊ฐ€ ๋”์ด์ƒ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š์€๊ฒฝ์šฐ, ์›์†Œ(value)๋ฅผ ๊ฒฐํ•ฉ(combine)ํ•  ๋•Œ,์–‘์ชฝ์˜ value๋ฅผ ๋น„๊ต ํ›„ ์ •๋ ฌ๋ฐฉ์‹๋Œ€๋กœ combine์„ ์‹คํ–‰ํ•œ๋‹ค.

  • ์žฌ๊ท€๋ฅผ ์ด์šฉ ( recursion )

  • ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    /*merge (๋ณ‘ํ•ฉ) ๊ณผ์ •*/
    /*
     * ์™ผ์ชฝ ๋ฐฐ์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด ๋น„๊ตํ•˜๋ฉฐ sorted๋ฐฐ์—ด ( ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ )์— ์‚ฝ์ž…
     *
     * ํ•œ์ชฝ๋จผ์ € ๋‹ค sorted์— ์‚ฝ์ž…๋˜์—ˆ๋‹ค๋ฉด ๋‚จ์•„ ์žˆ๋Š” ๋‹ค๋ฅธ์ชฝ ๋ฐฐ์—ด ๊ฐ’ sorted ๋ฐฐ์—ด์— ๋ชจ๋‘ ์‚ฝ์ž…
     *
     * sorted์˜ ๋ฐฐ์—ด ( ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด )์„ ์›๋ž˜ ๋ฐฐ์—ด์— ๋ณต์‚ฌ
     */


    void Merge_sort(int array[],int left, int right){
        int mid;
        if(left<right){
            mid = (left+right) /2;
            Merge_sort(array,left,mid);     // ์žฌ๊ท€
            Merge_sort(array,mid+1,right);  // ์žฌ๊ท€
            Merge(array,left,mid,right);    // merge (๋ณ‘ํ•ฉ)
        }
    }

Code ๋ณด๊ธฐ (c++)


Quick Sort

  • Unstable sort

  • ๋ถ„ํ• ๊ณผ ์ •๋ณต ์ด์šฉ ( Divide & Conquer )

  • ๋ถ„ํ• ์‹œ ๊ธฐ์ค€ ๊ฐ’ (pivot)์„ ์„ค์ • ํ›„ ํ•ด๋‹น pivot์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ, ์šฐ๋กœ ์ž‘์€, ํฐ ๊ฐ’์„ ๋ฐฐ์น˜ ์‹œํ‚จ ํ›„ pivot๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋“ค, ํฐ ์ˆซ์ž๋“ค์˜ ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ„ํ•  ์ •๋ ฌ์„ ํ•˜๋Š” ๋ฐฉ์‹

  • pivot์€ ๊ธฐ์ค€์ ์œผ๋กœ ์ค‘๊ฐ„๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

  • pivot์„ ๊ณ„์† ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ or ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์„ค์ •์‹œ worst case๋กœ O(n^2)์ด ๋œ๋‹ค.

  • ๋”ฐ๋ผ์„œ pivot์„ ์–ด๋–ป๊ฒŒ ์žก์•„์„œ partitioningํ• ์ง€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

  • balanced partitioning : ์ขŒ์šฐ๊ฐ€ ๋™์ผํ•œ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋„๋ก pivot์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ => ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ

/*pivot์„ 0 ( ์‹œ์ž‘ ์  )์œผ๋กœ ์„ค์ •ํ•˜์˜€์„ ๊ฒฝ์šฐ*/
void QuickSort(int array[],int pivot, int arrlen){
   int left = pivot+1, right = arrlen-1;

    if(pivot>=arrlen-1) return;

    /*right๊ฐ€ left์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ž‘์•„์งˆ๋•Œ๊นŒ์ง€*/
    while(left<=right){
        while(left <= arrlen-1 && array[left]<=array[pivot])left++;    //ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐพ๊ธฐ
        while(right > pivot && array[right]>=array[pivot])right--;   //ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฐพ๊ธฐ
        if(left<right) swap(array[left],array[right]);  //left์™€ right๊ฐ€ ๊ต์ฐจํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‘ ๊ฐ’์„ swap

        /*๊ต์ฐจ ํ–ˆ๋‹ค๋ฉด, pivot์˜ ๊ฐ’๊ณผ right๊ฐ’์„ swap ( ์ด๋•Œ right๊ฐ’์€ pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)*/
        else swap(array[pivot],array[right]);
   }
    QuickSort(array,pivot,right);   //pivot์˜ ์™ผ์ชฝ ๋ฐฐ์—ด ์ •๋ ฌ
    QuickSort(array,right+1,arrlen); //pivot์˜ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด ์ •๋ ฌ
}

Code ๋ณด๊ธฐ (c++)


Shell Sort

  • Unstable sort

  • ์‚ฝ์ž…์ •๋ ฌ์„ ๋ณด์™„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ( ์–ด๋А์ •๋„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์†๋„๊ฐ€ ๋น ๋ฅธ ๊ฒƒ์—์„œ ์ฐฉ์•ˆ )

  • ์‚ฝ์ž…์ •๋ ฌ์€ ์‚ฝ์ž…ํ•  ๋•Œ, ์ด์›ƒํ•œ ์œ„์น˜๋กœ๋งŒ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. -> ์ด๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์…€ ์ •๋ ฌ์€ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๊ณณ์„ ์‚ฝ์ž…์ •๋ ฌ์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค.

  • ์‚ฝ์ž…์ •๋ ฌ๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ•œ ๋ฒˆ์— ์ •๋ ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๊ฐ„๊ฒฉ์„ ์„ค์ • ํ•˜์—ฌ k๋ฒˆ์งธ ์š”์†Œ๋“ค์„ ์ถ”์ถœํ•˜์—ฌ ํ•ด๋‹น ์ˆซ์ž๋“ค์„ ์‚ฝ์ž…์ •๋ ฌ๋กœ ์ •๋ ฌ ํ›„, k๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์—ฌ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

  • ๊ฐ„๊ฒฉ(gap) : ์ดˆ๊นƒ๊ฐ’ = ์ •๋ ฌํ•  ๊ฐ’์˜ ์ˆ˜/2
    ์ƒ์„ฑ๋œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐœ์ˆ˜๋Š” gap๊ณผ ๊ฐ™๋‹ค.

    void shell_sort(int list[], int n){
        int i, gap;  // gap์˜ ์ดˆ๊ธฐ ๊ฐ’ : ์ •๋ ฌํ•  ๊ฐ’์˜ ์ˆ˜/2

        for(gap=n/2; gap>0; gap=gap/2){
            if((gap%2) == 0){
                gap++; // gap์„ ํ™€์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค.
            }

            // ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐœ์ˆ˜๋Š” gap๊ณผ ๊ฐ™๋‹ค.
            for(i=0; i<gap; i++){
            // ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์‚ฝ์ž… ์ •๋ ฌ ์ˆ˜ํ–‰
            insertion_sort(list, i, n-1, gap);
            }
        }
    }

Code ๋ณด๊ธฐ (c++)


Heap Sort

  • Unstable sort

  • Heap ์ž๋ฃŒ๊ตฌ์กฐ ( Complete Binary Tree ์˜ ์ผ์ข… )์„ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐฉ๋ฒ•

  • ๋ฐฐ์—ด์„ heapify( heap์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ ) ์„ ๊ฑฐ์ณ์„œ value๋ฅผ ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์˜ ์ •๋ ฌ

  • ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์„ฑ์ด ํ•„์š” ์—†๋‹ค.

  • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ์œ„ํ•ด ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑํ•˜๊ณ , ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ์œ„ํ•ด ์ตœ์†Œ ํž™์„ ๊ตฌ์„ฑ.

  • heapify๋ฅผ ์ž‘์„ฑํ• ๋•Œ top-down ๋ฐฉ์‹๊ณผ bottom-up๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ bottom-up์ด ์‚ด์ง ๋” ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

    • top-down : ์•„๋ž˜์—์„œ ๋ถ€ํ„ฐ ์œ„๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋น„๊ต/๊ตํ™˜ํ•˜์—ฌ heapify๋ฅผ ์ˆ˜ํ–‰
    • bottom-up : ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉฐ ๋น„๊ต/๊ตํ™˜ํ•˜์—ฌ heapify๋ฅผ ์ˆ˜ํ–‰
      • leaf node๋Š” heapify๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— leaf node์˜ ๋ถ€๋ชจ ๋ถ€ํ„ฐ heapify๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— build heap๊ณผ์ •์—์„œ top-down๋ฐฉ์‹์€ n๋ฒˆ์„ ๋น„๊ตํ•˜์ง€๋งŒ bottom-up๋ฐฉ์‹์€ 2/n ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๊ฐ€๋Šฅํ•˜๋‹ค.
void top_down_HeapSort(int *array, int arrlen){
    //build heap
    top_down_heapify(array,arrlen);

    for(int i= arrlen-1 ; i>=0; i--){
        swap(array[i],array[0]);    //๊ฐ€์žฅ ํฐ ์ˆซ์ž(๋ฃจํŠธ)๋ฅผ ๋งจ ๋’ท ๋…ธ๋“œ๋กœ swapํ•ด์ค€๋‹ค.
        top_down_heapify(array,i);  //swapํ•œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  heapify๋ฅผ ํ•ด์ค€๋‹ค.
    }                               //๊ฒฐ๊ณผ์ ์œผ๋กœ ํฐ ์ˆซ์ž๋“ค์ด ๋’ค์— ์˜ค๊ฒŒ ๋˜๋ฉฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค.
}

void bottom_up_HeapSort(int *array, int arrlen){
    //build heap
    for(int i= arrlen / 2 - 1; i >= 0; i--){
        bottom_up_heapify(array,i,arrlen);
    }

    for(int i = arrlen-1; i >= 0; i--){
        swap(array[i],array[0]);         //๊ฐ€์žฅ ํฐ ์ˆซ์ž(๋ฃจํŠธ)๋ฅผ ๋งจ ๋’ท ๋…ธ๋“œ๋กœ swapํ•ด์ค€๋‹ค.
        bottom_up_heapify(array,0,i);   //swapํ•œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  heapify๋ฅผ ํ•ด์ค€๋‹ค.
    }                                   //๊ฒฐ๊ณผ์ ์œผ๋กœ ํฐ ์ˆซ์ž๋“ค์ด ๋’ค์— ์˜ค๊ฒŒ ๋˜๋ฉฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค.
}

Code ๋ณด๊ธฐ (c++)


Radix Sort

  • Stable sort

  • Non-Comparisions Sorting Algorithm ( ๋น„๊ตํ•˜์ง€ ์•Š๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ )

  • ๊ธฐ์ˆ˜ (Radix) : ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ์š”์†Œ

  • ํ•˜๋‚˜์˜ ๊ธฐ์ˆ˜๋งˆ๋‹ค ๋ฒ„ํ‚ท (๋ฐ์ดํ„ฐ ๊ณต๊ฐ„)์„ ์ƒ์„ฑํ•˜์—ฌ ๋ถ„๋ฅ˜ํ•˜์—ฌ ๋ฒ„ํ‚ท์•ˆ์—์„œ ๋‹ค์‹œ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹

  • ์ •๋ ฌ ๋ฐฉ์‹

    • LSD ( Least Significant Digit ) : ๋œ ์ค‘์š”ํ•œ ๊ธฐ์ˆ˜๋ถ€ํ„ฐ ์ •๋ ฌ
      ์˜ˆ๋ฅผ๋“ค์–ด์„œ ์ผ์˜ ์ž๋ฆฌ์ˆ˜์ž๋ถ€ํ„ฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„์— ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
    • MSD ( Most Significant Digit ) : ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ์ˆ˜๋ถ€ํ„ฐ ์ •๋ ฌ
      ์˜ˆ๋ฅผ๋“ค์–ด์„œ ๋ฐฑ์˜ ์ž๋ฆฌ์ˆซ์ž๋ถ€ํ„ฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„์— ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜์žˆ์œผ๋‚˜ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
void RadixSort(int *array,int arrlen){
    int digit=1;
    int k;  //k๋Š” radix(๊ธฐ์ˆ˜ = ๊ฐ ์ž๋ฆฌ์ˆ˜์˜ ์ˆซ์ž)

    /*๋ฐฐ์—ด์˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ž๋ฆฟ์ˆ˜ ์•Œ์•„๋‚ด๊ธฐ*/
    while(digit<MAXVALUE)
        digit*=10;

    /*๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ž๋ฆฟ์ˆ˜ ๋งŒํผ ๋งŒํผ ๋ฐ˜๋ณต*/
    for(int i=1; i<digit ; i*=10){
        /*queue(bucket)์— ์˜ฎ๊ธฐ๊ธฐ*/
        for(int j=0;j<arrlen;j++){
            k=(array[j]/i)%10;
            q[k].push(array[j]);  //q๋Š” bucket
        }

        /*array์— ์˜ฎ๊ธฐ๊ธฐ*/
        int idx=0;
        for(int j=0;j<10;j++){
            while(!q[j].empty()){
                array[idx]=q[j].front();
                q[j].pop();
                idx++;
            }
        }
    }
}

Code ๋ณด๊ธฐ (c++)


Counting Sort

  • stable sort

  • Non-Comparisions Sorting Algorithm( ๋น„๊ตํ•˜์ง€ ์•Š๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ )

  • ์ข์€ ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•  ๋•Œ ์œ ์šฉ ( ex. Score )

  • ๋ฒ•์œ„๊ฐ€ ๋„“์–ด์ง€๊ฒŒ ๋˜๋ฉด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋งŽ์ด ํ•„์š”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ

  • ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ Radix Sort์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค.

  • ์ •๋ ฌ์„ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •๋ ฌํ•  ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ํฐ ๊ฐ’๋งŒํผ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

  • ๊ณผ์ •

    • ์ •๋ ฌํ•  ๋ฐฐ์—ด A, ์ถ”๊ฐ€ ๋ฐฐ์—ด C๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.
    • ๋ฐฐ์—ด C๋Š” ๋ชจ๋“  ๊ฐ’์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
    • ๋ฐฐ์—ด A์˜ ๊ฐ’์„ ํ† ๋Œ€๋กœ ๋ฐฐ์—ด C์˜ ์ธ๋ฑ์Šค๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ’์„ 1์”ฉ์˜ฌ๋ ค์ค€๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด A์˜ ๊ฐ’์ค‘ 3์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, C์˜ 3๋ฒˆ์งธ ์ธ๋ฑ์Šค ๊ฐ’์„ 1๋”ํ•ด์ค€๋‹ค.)
    • ๋ฐฐ์—ด c์˜ ๊ฐ ๊ฐ’๋“ค์„ ์ง์ „ ๊ฐ’์„ ๋”ํ•ด ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.
      (์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด C๊ฐ€ 1,0,2,2 ์˜€๋‹ค๋ฉด, 1,1,3,5๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.)
    • ๋ฐฐ์—ด C๋Š” ๋ฐฐ์—ด A์˜ ๊ฐ’๋“ค์˜ ์ธ๋ฑ์Šค ๊ฐ’์ด๋ฏ€๋กœ, ๋ฐฐ์—ด A๋ฅผ ๋์—์„œ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ ํ›‘์œผ๋ฉด์„œ ๋ฐฐ์—ด B์— ์ •๋ ฌํ•ด ์ค€๋‹ค. (์ด๋•Œ, ํ•œ ๊ฐ’์„ B์— ์˜ฎ๊ฒจ์ฃผ์—ˆ๋‹ค๋ฉด, ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๋ฐฐ์—ด C์˜ ๊ฐ’์€ 1์„ ๋นผ์ค€๋‹ค.)
    int *c = new int[maxValue+1];   //0๋„ ํฌํ•จํ•œ ์ˆซ์ž๋ฅผ ์ •๋ ฌ ํ•  ๊ฒฝ์šฐ maxValue + 1๋งŒํผ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

/*๊ฐ ์ˆซ์ž ํšŸ์ˆ˜ ์นด์šดํ‹ฑํ•˜๋ฉฐ c๋ฐฐ์—ด ์ธ๋ฑ์Šค ๊ฐ’ ์ฆ๊ฐ€*/
    for(int i = 0; i < a_size ; i++){
        c[a[i]]++;
    }

    /*๋ฐฐ์—ด c์˜ ์ธ๋ฑ์Šค ๊ฐ’ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ*/
    for(int i=1; i < c_size; i++){
        c[i] += c[i-1];
    }

    /*๋ฐฐ์—ด A์—ญ์ˆœ์œผ๋กœ ํ›‘์œผ๋ฉฐ, ๋ฐฐ์—ด C์ฐธ์กฐํ•˜์—ฌ ์ •๋ ฌ*/
    for(int i = a_size-1; i >= 0; i-- ){
        b[c[a[i]]-1] = a[i];
        --c[a[i]];
    }

Code ๋ณด๊ธฐ (c++)