[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge Sort)์ด๋ž€?

2022. 12. 18. 20:02ยท๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ •๋ ฌ ๋ฐ ํƒ์ƒ‰
728x90

ํ•ฉ๋ณ‘์ •๋ ฌ์ด๋ž€

  • ๋ฆฌ์ŠคํŠธ๋ฅผ 2๊ฐœ์˜ ๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ๋œ ๋ถ€๋ถ„๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • ์ •๋ ฌ๋œ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉํ•˜์—ฌ ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ๋‹ค.
  • ํ•ฉ๋ณ‘์ •๋ ฌ์€ ์•ˆ์ • ์ •๋ ฌ(Stable)์— ์†ํ•˜๋ฉฐ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜(Divide and conquer)์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.
๋ถ„ํ• ์ •๋ณต์ด๋ž€? ๋ฌธ์ œ๋ฅผ ์ž‘์€ 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ์„ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„์„œ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ „๋žต
๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์€ ๋Œ€๊ฐœ ์žฌ๊ท€ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๋ถ„ํ• (Divide): ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๊ฐ™์€ ํฌ๊ธฐ์˜ 2๊ฐœ์˜ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• 

์ •๋ณต(Conquer): ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์ง€ ์•Š์œผ๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์‹œ ๋ถ„ํ• ๋ฐฉ๋ฒ•์ ์šฉ

๊ฒฐํ•ฉ(Combine): ์ •๋ ฌ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋“ค์„ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ํ•ฉ๋ณ‘ํ•œ๋‹ค.


 

ํ•ฉ๋ณ‘์ •๋ ฌ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…

  • ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค
  • ๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ๋•Œ๋„ ํ•ฉ๋ณ‘ ์ •๋ ฌ์„ ์ˆœํ™˜์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ ์šฉํ•œ๋‹ค.
  • ํ•ฉ๋ณ‘์ •๋ ฌ์—์„œ ์‹ค์ œ๋กœ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์‹œ์ ์€ 2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ๋ณ‘(Merge)ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.

ํ•ฉ๋ณ‘์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์ œ

  1. 2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋“ค์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’ ์ค‘์—์„œ ๋” ์ž‘์€ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ(sorted)๋กœ ์˜ฎ๊ธด๋‹ค.
  2. ๋‘˜ ์ค‘์—์„œ ํ•˜๋‚˜๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋˜ํ’€์ดํ•œ๋‹ค.
  3. ๋งŒ์•ฝ ๋‘˜์ค‘์—์„œ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋จผ์ € ๋๋‚˜๊ฒŒ ๋˜๋ฉด ๋‚˜๋จธ์ง€ ๋ฆฌ์ŠคํŠธ ๊ฐ’๋“ค์„ ์ „๋ถ€ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  4. ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์›๋ž˜์˜ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ธด๋‹ค.

ํ•ฉ๋ณ‘์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ C์ฝ”๋“œ

# include <stdio.h>
# define MAX_SIZE 8
int sorted[MAX_SIZE]; // ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์ด ํ•„์š”

// i: ์ •๋ ฌ๋œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
// j: ์ •๋ ฌ๋œ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
// k: ์ •๋ ฌ๋  ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค
/* 2๊ฐœ์˜ ์ธ์ ‘ํ•œ ๋ฐฐ์—ด list[left...mid]์™€ list[mid+1...right]์˜ ํ•ฉ๋ณ‘ ๊ณผ์ • */
/* (์‹ค์ œ๋กœ ์ˆซ์ž๋“ค์ด ์ •๋ ฌ๋˜๋Š” ๊ณผ์ •) */
void merge(int list[], int left, int mid, int right){
  int i, j, k, l;
  i = left;
  j = mid+1;
  k = left;

  /* ๋ถ„ํ•  ์ •๋ ฌ๋œ list์˜ ํ•ฉ๋ณ‘ */
  while(i<=mid && j<=right){
    if(list[i]<=list[j])
      sorted[k++] = list[i++];
    else
      sorted[k++] = list[j++];
  }

  // ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ผ๊ด„ ๋ณต์‚ฌ
  if(i>mid){
    for(l=j; l<=right; l++)
      sorted[k++] = list[l];
  }
  // ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ผ๊ด„ ๋ณต์‚ฌ
  else{
    for(l=i; l<=mid; l++)
      sorted[k++] = list[l];
  }

  // ๋ฐฐ์—ด sorted[](์ž„์‹œ ๋ฐฐ์—ด)์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด list[]๋กœ ์žฌ๋ณต์‚ฌ
  for(l=left; l<=right; l++){
    list[l] = sorted[l];
  }
}

// ํ•ฉ๋ณ‘ ์ •๋ ฌ
void merge_sort(int list[], int left, int right){
  int mid;

  if(left<right){
    mid = (left+right)/2; // ์ค‘๊ฐ„ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ท ๋“ฑ ๋ถ„ํ•  -๋ถ„ํ• (Divide)
    merge_sort(list, left, mid); // ์•ž์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ -์ •๋ณต(Conquer)
    merge_sort(list, mid+1, right); // ๋’ค์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ -์ •๋ณต(Conquer)
    merge(list, left, mid, right); // ์ •๋ ฌ๋œ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ํ•ฉ๋ณ‘ํ•˜๋Š” ๊ณผ์ • -๊ฒฐํ•ฉ(Combine)
  }
}

int main(void){
  int i;
  int n = MAX_SIZE;
  int list[8] = {21, 10, 12, 20, 25, 13, 15, 22};

  // ํ•ฉ๋ณ‘ ์ •๋ ฌ ์ˆ˜ํ–‰(left: ๋ฐฐ์—ด์˜ ์‹œ์ž‘ = 0, right: ๋ฐฐ์—ด์˜ ๋ = 7)
  merge_sort(list, 0, n-1);

  // ์ •๋ ฌ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
  for(i=0; i<n; i++){
    printf("%d ", list[i]);
  }
}

 


 

ํ•ฉ๋ณ‘์ •๋ ฌ ํŠน์ง• ๋ฐ ์‹œ๊ฐ„๋ณต์žก๋„

์žฅ์ 

  • ์•ˆ์ •์ ์ธ ์ •๋ ฌ๋ฐฉ๋ฒ•, ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ ์˜ํ–ฅ์„ ๋œ ๋ฐ›๋Š”๋‹ค.(์ •๋ ฌ๋˜๋Š” ์‹œ๊ฐ„์€ ๋™์ผ)
  • ๋งŒ์•ฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด, ๋งํฌ ์ธ๋ฑ์Šค๋งŒ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ์ด๋™์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์„์ •๋„๋กœ ์ž‘์•„์ง„๋‹ค.
  • ์ธํ”Œ๋ ˆ์ด์Šค(in-place sorting)์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ํฌ๊ธฐ๊ฐ€ ํฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ •๋ ฌํ•  ๊ฒฝ์šฐ์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์–ด๋–ค ๋ฐฉ๋ฒ•๋ณด๋‹ค ํšจ์œจ์ ์ด๋‹ค.

๋‹จ์ 

  • ๋งŒ์•ฝ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑํ•˜๋ฉด, ์ž„์‹œ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ œ์ž๋ฆฌ ์ •๋ ฌ(in-place)์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ๋“ค์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” ์ด๋™ํšŒ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ๋งค์šฐ ํฐ ์‹œ๊ฐ„์  ๋‚ญ๋น„๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค.

ํ•ฉ๋ณ‘์ •๋ ฌ ์‹œ๊ฐ„๋ณต์žก๋„

๋ถ„ํ• ๋‹จ๊ณ„๋Š” ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด๋™์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•ฉ๋ณ‘๋‹จ๊ณ„๋Š” ์•„๋ž˜ ์™€ ๊ฐ™๋‹ค.

ํ•ฉ๋ณ‘๋‹จ๊ณ„ ๋น„๊ต ํšŒ์ˆ˜

  • ํฌ๊ธฐ n์ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •ํ™•ํžˆ ๊ท ๋“ฑ ๋ถ„๋ฐฐํ•˜๋ฏ€๋กœ log(n) ๊ฐœ์˜ ํŒจ์Šค
  • ๊ฐ ํŒจ์Šค์—์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ n๊ฐœ๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ n๋ฒˆ์˜ ๋น„๊ต ์—ฐ์‚ฐ

์ด๋™ํšŒ์ˆ˜๋Š”

  • ๋ ˆ์ฝ”๋“œ์˜ ์ด๋™์ด ๊ฐ ํŒจ์Šค์—์„œ 2n๋ฒˆ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ „์ฒด ๋ ˆ์ฝ”๋“œ์˜ ์ด๋™์€ 2n*log(n)๋ฒˆ ๋ฐœ์ƒ
  • ๋ ˆ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ํฐ ์‹œ๊ฐ„์  ๋‚ญ๋น„ ์ดˆ๋ž˜
  • ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํ•ฉ๋ณ‘ ์ •๋ ฌํ•  ๊ฒฝ์šฐ, ๋งค์šฐ ํšจ์œจ์ 
์ฆ‰, T(n) = nlogโ‚‚n(๋น„๊ต) + 2nlogโ‚‚n(์ด๋™) = 3nlogโ‚‚n = O(nlogโ‚‚n)

 

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ •๋ ฌ ๋ฐ ํƒ์ƒ‰' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ธฐ์ˆ˜์ •๋ ฌ(Radix Sort)์ด๋ž€?
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ€ต ์ •๋ ฌ(Quick Sort)์ด๋ž€?
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‰˜ ์ •๋ ฌ(Shell Sort)์ด๋ž€?
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฒ„๋ธ”์ •๋ ฌ(Bubble Sort)์ด๋ž€?
juno1105
juno1105
๊ณต๋ถ€ํ•˜๋Š” ๊ฒธ ํฌํด ๋ธ”๋กœ๊ทธ
  • juno1105
    @juno1105
    juno1105
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (89)
      • ๐Ÿ’ฌ ์ž์œ  (3)
      • ๐Ÿ“– ์–ดํ•™ ๊ณต๋ถ€ (0)
      • ๐Ÿ“” ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ (4)
      • ๐Ÿ›  ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๋ฒ• (1)
      • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (53)
        • ์Šคํƒ (4)
        • ํ (4)
        • ์ •๋ ฌ ๋ฐ ํƒ์ƒ‰ (17)
        • ๋ฆฌ์ŠคํŠธ (5)
        • ํ•ด์‹œ (1)
        • ํŠธ๋ฆฌ (8)
        • ํž™ (2)
        • ๊ทธ๋ž˜ํ”„ (12)
      • ๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ๐Ÿšฅ ๋…ผ๋ฆฌํšŒ๋กœ (8)
      • ๐Ÿ”ฐ ๋ฐฑ์ค€ (20)
        • ํ, ์Šคํƒ, ๋ฑ (0)
        • DFS ์™€ BFS (3)
        • ๊ทธ๋ฆฌ๋”” (0)
        • ๋™์ ๊ณ„ํš๋ฒ• 1 (16)
        • ๋™์ ๊ณ„ํš๋ฒ• 2 (0)
        • ์ตœ๋‹จ ๊ฒฝ๋กœ (0)
        • ํŠธ๋ฆฌ (0)
        • ๋ฐฑํŠธ๋ž˜ํ‚น (0)
        • ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (0)
        • ์ง‘ํ•ฉ๊ณผ ๋งต (1)
      • ๐ŸŒˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (0)
      • ๐Ÿ“ฑ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • โœจ์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ปค๋ฆฌํ˜๋Ÿผโœจ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ •๋ ฌ ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    ํ† ์ต 910์ 
    ํ† ์ต 900์ 
    ์ •๋ ฌ
    ํ† ์ต
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํ† ์ต 900์ ๋Œ€
    ์ •๋ ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ
    ์ตœ๋‹จ๊ฒฝ๋กœ
    ์‹œ๊ฐ„๋ณต์žก๋„
    ํ† ์ต 900
    ํ† ์ต 920์ 
    ํ† ์ต 950์ 
    ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰
    ๋น…์˜คํ‘œ๊ธฐ๋ฒ•
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
juno1105
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge Sort)์ด๋ž€?
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”